python - 如何设置垂直网格线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()
解决方案
您只设置了主要刻度,缺少次要刻度。我曾经有一个类似的问题,我只想要年度主要行和季度次要行,包括刻度标签。我的解决方案看起来是这样的(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)
这个片段以不同的风格创建了季度行和年度行,也许这可以帮助你。
推荐阅读
- android - 在房间数据库中调用“插入”不会完成交易
- spring-aop - 带有“@target”的 Spring AOP 切入点不起作用,因为无法访问当前调用
- haskell - Haskell管道:如何将字节串写入文件
- php - 无法将数据保存在数据库中。谁能告诉我错误
- pybind11 - pybind11,将 std::vector 转换为 py::list
- php - 如何使用mysql php选择与字符串中的某些单词匹配的所有记录
- sql - 如何将三个查询合二为一并可能提高性能
- mikroc - 为什么我的 If 语句不能正常工作?
- java - 如何在这段代码中使用非静态变量?
- scala - Guice Scala 模块 - 没有有效的构造函数