Как вы регулируете интервал на диаграмме и ее метках? - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь создать диаграмму (наложенную на линейный график с днями в качестве оси x вместо кварталов), где метки обозначают дни конца квартала. Это все хорошо, и генерирует хорошо, но я пытаюсь установить метки так, чтобы они были выровнены с правым краем графика, а правая сторона соответствующего бара была выровнена с отметкой x.

Воспроизводимый пример (только с гистограммой, а не с линией):

import matplotlib.pyplot as pyplot
import pandas
import random
random.seed(2020)

dates = pandas.date_range("2016-12-31", "2017-12-31")
bar = pandas.DataFrame([.02, .01, -0.01, .05], index = ["2017-03-31", "2017-06-30", "2017-09-30", "2017-12-31"], columns = ["test"])
line = pandas.DataFrame([random.random() for r in range(len(dates))], index = dates, columns = ["test"])

fig, ax = pyplot.subplots(1, 1, figsize = (7, 3))
ax2 = fig.add_subplot(111, frame_on = False)
bar.plot(kind = "bar", ax = ax, width = 1)
line.plot(kind = "line", ax = ax2)

ax2.set_xticks([])
ax.yaxis.tick_right()
ax.yaxis.set_label_position("right")
fig.tight_layout()
pyplot.show()

Что дает график в виде: enter image description here

Моя цель выравнивание правой стороны столбца 2017-12-31 с правым краем графика, а также с правой стороны надписи 2017-12-31. Далее, левая сторона бара 2017-03-31 касается левой части графика. Что касается оставшихся столбцов, я бы хотел, чтобы они были равномерно распределены так, чтобы все метки были выровнены по правой стороне каждого столбца, и между ними не должно быть пробелов. Как этот пример ниже:

enter image description here

Честно говоря, я в растерянности. Я попытался добавить ha = "right", но безрезультатно, и просто сдвинул графики, но это оставляет меня с другими проблемами и на самом деле не решает проблему. Даже со смещенными барами я все еще довольно ограничен в перемещении меток тиков и не нашел в Интернете ничего, что могло бы удаленно решить проблему.

Было бы лучше создать гистограмму, чтобы она имела тот же индекс, что и на линейном графике, а затем установите метки x в качестве желаемых дат?

У кого-нибудь есть указания? Я потратил слишком много времени на эту проблему сегодня, и это сводит меня с ума.

1 Ответ

1 голос
/ 05 марта 2020

Чтобы плотно построить гистограмму, вы можете использовать функцию autoscale, как показано ниже.

Чтобы переместить метки тиков, вы можете изменить преобразования, включив в них некоторое смещение. Ниже я использовал 0,7, но вы можете выбрать его на основе других размеров, используемых на вашем графике.

import matplotlib.pyplot as pyplot
import pandas
import matplotlib.transforms as tr
df = pandas.DataFrame([.02, .01, -0.01, .05], index = ["2017-03-31", "2017-06-30", "2017-09-30", "2017-12-31"], columns = ["test"])
fig, ax = pyplot.subplots(1, 1, figsize = (7, 3))
df.plot(kind = "bar", ax = ax, width = 1)
pyplot.autoscale(enable=True, axis='x', tight=True) # tight layout
# for each tick label, shift 0.7 to right
for tick in ax.get_xticklabels():
    tick.set_transform(tick.get_transform()+tr.ScaledTranslation(0.7, 0, fig.dpi_scale_trans))
pyplot.show()

Результат выглядит следующим образом. enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...