我正在绘制时间序列数据,我想在曲线中保持分辨率,但我希望在x轴上显示更少的年份。我已将'Year'列解析为日期,我已将该列放入数据框的索引中。我觉得应该很容易减少标签的频率,但我尝试的所有内容都只是使标签不准确。
DataFrame的格式为:
print(total_df.head())
All ages Age 18 or older
Year
1978 131.0 183.0
1979 133.0 185.0
1980 138.0 191.0
1981 153.0 211.0
1982 170.0 232.0
我一直在使用这段代码来制作我的情节。
with sns.axes_style("whitegrid"):
fig, ax = plt.subplots(figsize=(10,7))
ax.plot(total_df['All ages'])
ax.plot(total_df['Age 18 or older'])
ax.set_title('Total Imprisonment Rates (table: p16f01)')
ax.set_xlabel('Year')
ax.set_ylabel('People imprisoned (per 100k US population)')
ax.set_xticklabels(total_df.index, rotation=70)
ax.legend()
ax.set_ylim([0, 1.1*max([total_df['All ages'].max(),
total_df['Age 18 or older'].max()])])
答案 0 :(得分:1)
这不应该发生。如果你确定你的索引是实际数字而不是字符串,那就不会发生。
要将索引转换为数字,请使用例如
df.index = df.index.values.astype(int)
然后移除set_xticklabels
行,因为如果您通过set_ticks
设置滴答,这只会有意义。
这将确保matplotlib自动选择刻度线之间的有用间距。
完整示例:
import matplotlib.pyplot as plt
import numpy as np;np.random.seed(9)
import pandas as pd
inx = np.arange(1978,2017).astype(str)
a = np.cumsum(np.random.randn(len(inx),2), axis=0)+10
df = pd.DataFrame(a, index=inx, columns=list("AB"))
df.index = df.index.values.astype(int)
fig, ax = plt.subplots(figsize=(10,7))
ax.plot(df['A'])
ax.plot(df['B'])
ax.set_xlabel('YEAR')
ax.legend()
ax.set_ylim([0, 1.1*max([df['A'].max(),
df['B'].max()])])
plt.show()