首页 > 解决方案 > 如何设置垂直网格线matplotlib

问题描述

我有一个时间序列图,显示每个月和一个值。

我添加了 gridlines plt.grid(True,which='major'),它每个月都会显示。我的时间序列是 10 年,每年我只想看到 1 个网格。

我的主要刻度标签是:

ax.xaxis.get_majorticklocs()
array([  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,
        11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,  21.,
        22.,  23.,  24.,  25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,
        33.,  34.,  35.,  36.,  37.,  38.,  39.,  40.,  41.,  42.,  43.,
        44.,  45.,  46.,  47.,  48.,  49.,  50.,  51.,  52.,  53.,  54.,
        55.,  56.,  57.,  58.,  59.,  60.,  61.,  62.,  63.,  64.,  65.,
        66.,  67.,  68.,  69.,  70.,  71.,  72.,  73.,  74.,  75.,  76.,
        77.,  78.,  79.,  80.,  81.,  82.,  83.,  84.,  85.,  86.,  87.,
        88.,  89.,  90.,  91.,  92.,  93.,  94.,  95.,  96.,  97.,  98.,
        99., 100., 101., 102., 103., 104., 105., 106., 107., 108., 109.,
       110., 111., 112.])

我试图改变我的主要刻度标签:

labels = ['']*len(ax.xaxis.get_majorticklocs())
idx=list(range(len(labels))[0::11])
for i in idx:
    labels[i]=ax.xaxis.get_majorticklocs()[i]
labels[len(labels)-1]=ax.xaxis.get_majorticklocs()[len(labels)-1]
from numpy import array 
labels=array(labels)
ax.set_xticks(labels)

标签是:

array(['0.0', '', '', '', '', '', '', '', '', '', '', '11.0', '', '', '',
       '', '', '', '', '', '', '', '22.0', '', '', '', '', '', '', '', '',
       '', '', '33.0', '', '', '', '', '', '', '', '', '', '', '44.0', '',
       '', '', '', '', '', '', '', '', '', '55.0', '', '', '', '', '', '',
       '', '', '', '', '66.0', '', '', '', '', '', '', '', '', '', '',
       '77.0', '', '', '', '', '', '', '', '', '', '', '88.0', '', '', '',
       '', '', '', '', '', '', '', '99.0', '', '', '', '', '', '', '', '',
       '', '', '110.0', '', '112.0'], dtype='<U32')

不幸的是,当我绘图时,所有的主要部分都没有改变,我仍然在网格线上看到每个月。

我的情节是:

fig, ax = plt.subplots(figsize=(20,20))
plt.plot(SoldHx['month'],SoldHx['Price'])
fig.suptitle('Median Price by Month')

labels = ['']*len(SoldHx.index)
idx=list(range(len(labels))[0::12])
for i in idx:
    labels[i]=SoldHx['month'][i]
labels[len(labels)-1]=SoldHx['month'][len(labels)-1]

plt.xticks(SoldHx.month,labels,rotation=90)
plt.grid(True,which='major')

plt.show()

在此处输入图像描述

标签: pythonmatplotlib

解决方案


您只设置了主要刻度,缺少次要刻度。我曾经有一个类似的问题,我只想要年度主要行和季度次要行,包括刻度标签。我的解决方案看起来是这样的(pd from pands ...):

    years = list(range(2000, 2018))
    year_tick_pos = [pd.to_datetime(str(year) + "-01-01") for year in years]

    quarters = list()
    quarter_tick_pos = list()
    for year in years:
        for q in range(1, 5):
            new_quarter = pd.to_datetime(str(year) + "-" + str(q * 3 - 2).zfill(2) + "-01")
            if new_quarter <= limits[1]:
                quarter_tick_pos.append(new_quarter)
                quarters.append("Q" + str(q))

    ax.set_xlim(left=quarter_tick_pos[0] - pd.Timedelta('45 days'),
                right=quarter_tick_pos[-1] + pd.Timedelta('45 days'))

    ax.set_xticks(year_tick_pos)
    labels_major = ax.set_xticklabels(years)
    ax.set_xticks(quarter_tick_pos, minor=True)
    ax.set_xticklabels(quarters, minor=True, fontsize=8)

这个片段以不同的风格创建了季度行和年度行,也许这可以帮助你。


推荐阅读