Matplotlib: Как сделать так, чтобы альтернативные вертикальные линии сетки были пунктирными? - PullRequest
2 голосов
/ 06 апреля 2020

Если бы у меня была простая целочисленная ось x, я мог бы использовать plt.axvline(value) для получения вертикальных линий, но мне интересно, как получить вертикальные пунктирные линии, когда у нас есть строковые метки оси x.

setup

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline


np.random.seed(123)

x = np.random.normal(0,1,100)
xx = pd.cut(x,20).to_numpy().astype(str)

yy = np.random.normal(0,1,100)

plt.plot(xx,yy,'o')
plt.xticks(rotation=90)
plt.grid(True)

plt.show()

Обязательно

  • Все остальные вертикальные линии на сетке должны быть пунктирными и окрашенными.

токовый выход

enter image description here

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Нарисуйте линии сетки самостоятельно, меняя стиль так, как вы хотите для каждой другой вертикальной линии.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

np.random.seed(123)

x = np.random.normal(0,1,100)
xx = pd.cut(x,20).astype(str)
yy = np.random.normal(0,1,100)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(xx, yy,'o')
plt.xticks(rotation=90)

for index, xmaj in enumerate(ax.xaxis.get_majorticklocs()):
    if index % 2 == 0:
        ax.axvline(x=xmaj, ls='-', linewidth = 1.0, color = 'grey')
    else:
        ## add line change style/color here
        ax.axvline(x=xmaj, ls='--', linewidth = 1.0, color = 'blue')
for ymaj in ax.yaxis.get_majorticklocs():
    ax.axhline(y=ymaj, ls='-', linewidth = 1.0, color = 'grey')

plt.show()

alternating gridlines image

1 голос
/ 06 апреля 2020

plt.xticks() возвращает x меток мест и меток, поэтому мы можем получить доступ к локациям путем индексации с помощью [0]. Оказывается, это просто список последовательных целочисленных значений, поэтому мы можем через них l oop и нарисовать линии сетки вручную, с другим стилем для каждого другого. С помощью plt.grid(True, axis='y') мы гарантируем, что автоматическая сетка c рисуется только для оси y, чтобы это не мешало нашим пользовательским вертикальным линиям.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline


np.random.seed(123)

x = np.random.normal(0,1,100)
xx = pd.cut(x,20).to_numpy().astype(str)

yy = np.random.normal(0,1,100)

plt.plot(xx,yy,'o')
plt.xticks(rotation=90)

############################
# new code below           #
############################

plt.grid(True, axis='y')

for tick in plt.xticks()[0]:
    if tick % 2 == 0:
        plt.axvline(tick, color='gray', linestyle='-', linewidth=1, alpha=.5)
    else:
        plt.axvline(tick, color='red', linestyle='--', linewidth=1, alpha=1)

Custom Grid

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