Получение вертикальных линий сетки для отображения на линейном графике в matplotlib

95

Я хочу, чтобы на моем графике отображались как горизонтальные, так и вертикальные линии сетки, но по умолчанию отображаются только горизонтальные линии сетки. Я использую pandas.DataFrameзапрос sql в python для создания линейного графика с датами на оси x. Я не уверен, почему они не появляются в датах, и я пытался найти ответ на этот вопрос, но не смог его найти.

Все, что я использовал для построения графика, - это простой код ниже.

data.plot()
grid('on')

data - это DataFrame, который содержит даты и данные из запроса sql.

Я также попытался добавить приведенный ниже код, но все равно получаю тот же результат без вертикальных линий сетки.

ax = plt.axes()        
ax.yaxis.grid() # horizontal lines
ax.xaxis.grid() # vertical lines

Какие-либо предложения?

введите описание изображения здесь

Осмонд Бишоп
источник
data.plot(grid="on")работал у меня
Маркус

Ответы:

101

Вам может потребоваться указать логический аргумент в ваших вызовах, например, использовать ax.yaxis.grid(True)вместо ax.yaxis.grid(). Кроме того, поскольку вы используете оба из них, вы можете объединить их ax.grid, что работает с обоими, вместо того, чтобы делать это один раз для каждого измерения.

ax = plt.gca()
ax.grid(True)

Это должно у вас разобраться.

вим
источник
Я попробовал, но по какой-то причине он по-прежнему выглядит так же, как и раньше
Осмонд Бишоп
1
Вы делаете это в интерактивном интерпретаторе? Убедитесь , что вы устанавливаете сетку перед тем вызовомplt.show()
Вим
Я использую iPython. Я пробовал добавить plt.show (), это не имеет значения.
Осмонд Бишоп
1
Что ж, это странно. Какая у вас версия ipython, тоже попробуйте запустить как ipython --pylab, и делайте plt.grid(True)немедленно - вы видите сетку?
wim
Я попробовал plt.grid(True)и получил пустой график с вертикальными и горизонтальными линиями сетки, так что да, это странно, почему я не могу получить это для своего линейного графика. Я использую последнюю доступную версию iPython.
Осмонд Бишоп
59

plt.gca().xaxis.grid(True) оказался решением для меня

матовый
источник
6
myaxes.grid(which='x')Не работал для меня с Matplotlib версии 1.4.2 ... не может получить whichключевое слово для работы на всех. Однако myaxes.xaxis.grid(True)добился своего и концептуально лучше IMO. Да, и не забывайте о полезном myaxes.set_axisbelow(True)методе размещения сетки за данными.
travc
27

Согласно документации matplotlib , подпись метода Axesкласса grid()выглядит следующим образом:

Axes.grid (b = None, which = 'major', axis = 'both', ** kwargs) Включает
или выключает сетки осей.

which может быть «основным» (по умолчанию), «второстепенным» или «обоими», чтобы контролировать, будут ли затронуты основные сетки с отметками, второстепенные сетки или и то и другое.

axis может иметь значение «оба» (по умолчанию), «x» или «y» для управления отрисовкой набора линий сетки.

Итак, чтобы показать линии сетки как для оси x, так и для оси y, мы можем использовать следующий код:

ax = plt.gca()
ax.grid(which='major', axis='both', linestyle='--')

Этот метод дает нам более тонкий контроль над отображением линий сетки.

Jdhao
источник
7

возможно, это может решить проблему: matplotlib, определить размер сетки на графике

ax.grid(True, which='both')

Правда в том, что сетка работает, но в 00:00 только одна v-сетка и нет сетки в других. Я сталкиваюсь с той же проблемой, что 1 ноября среди многих дней только одна сетка.

Lory_yang
источник
3

Краткий ответ (подробнее читайте ниже):

ax.grid(axis='both', which='both')

введите описание изображения здесь

То, что вы делаете, правильно и должно работать.

Однако, поскольку ось X в вашем примере является осью DateTime, основные деления (скорее всего) появляются только на обоих концах оси X. Другие видимые отметки - это второстепенные отметки.

ax.grid()Метод, по умолчанию, рисует линию сетки на основных клещевых-метках. Следовательно, в вашем сюжете ничего не появляется.

Используйте приведенный ниже код, чтобы выделить галочки. Мажоры будут синими, а несовершеннолетние - красными.

ax.tick_params(which='both', width=3)
ax.tick_params(which='major', length=20, color='b')
ax.tick_params(which='minor', length=10, color='r')

Теперь, чтобы линии сетки отображались также и на второстепенных отметках, передайте which='minor'метод:

ax.grid(b=True, which='minor', axis='x', color='#000000', linestyle='--')

или просто используйте which='both'для рисования основных и второстепенных линий сетки. А это более элегантная линия сетки:

ax.grid(b=True, which='minor', axis='both', color='#888888', linestyle='--')
ax.grid(b=True, which='major', axis='both', color='#000000', linestyle='-')
Темно
источник
1

Только для горизонтальных линий

ax = plt.axes()        
ax.yaxis.grid() # horizontal lines

Это сработало

Мудит
источник