在 matplotlib 中以年为 bin 的时间序列绘制条形图
drawing bars for time series with years as bins in matplotlib
所以我有数据作为读数记录为一段时间内的月平均值。我已经画好了,但问题是图形有点乱,X 轴不可读,我已经尝试了两天没有成功绘制它,任何帮助将不胜感激。我能够使用完全相同的代码从 plotly 中获得我想要的图像,而不是使用“iplot”而不是“plot”进行绘图,您可以在第二张图像中看到结果。但问题是我无法将它导出为 SVG,此外我真的很喜欢 matplotlib,所以我想使用它。代码在最后,我还应该注意所有注释掉的行都是失败的尝试。
这是我得到的图表:
这是我想要的图像:
最后是代码:
fig, ax= plt.subplots(1,1)
# ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))
ax=hist.count().plot(kind='bar', color='brown', legend=True)
# ax.xaxis.set_major_locator(matplotlib.dates.YearLocator(10))
# ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("\n%Y"))
# plt.setp(ax.get_xticklabels(), rotation=0, ha="center")
# ax.xaxis.set_major_formatter(DateFormatter("%Y"))
# fig.autofmt_xdate()
# plt.xticks(hist['Date'], rotation=90)
plt.show()
这是数据的先前状态(按 WellCode 分组):
enter image description here
这是在每年对它们进行分组之后,基本上为出现分布制作直方图:
{Timestamp('1888-12-31 00:00:00', freq='A-DEC'): 1,
Timestamp('1889-12-31 00:00:00', freq='A-DEC'): 1,
Timestamp('1890-12-31 00:00:00', freq='A-DEC'): 1,
Timestamp('1891-12-31 00:00:00', freq='A-DEC'): 1,
Timestamp('1892-12-31 00:00:00', freq='A-DEC'): 1,
....................
Timestamp('2000-12-31 00:00:00', freq='A-DEC'): 411670,
Timestamp('2001-12-31 00:00:00', freq='A-DEC'): 423100,
Timestamp('2002-12-31 00:00:00', freq='A-DEC'): 434910,
Timestamp('2003-12-31 00:00:00', freq='A-DEC'): 447776,
Timestamp('2004-12-31 00:00:00', freq='A-DEC'): 460983,
Timestamp('2005-12-31 00:00:00', freq='A-DEC'): 475415,
Timestamp('2006-12-31 00:00:00', freq='A-DEC'): 490284,
Timestamp('2007-12-31 00:00:00', freq='A-DEC'): 505549}
你有这个小数据,你想得到这个数据的直方图如下:
import matplotlib.pyplot as plt
lst = ['2010-01-01','2011-01-01','2011-01-01','2012-01-01','2012-01-01','2012-01-01',
'2013-01-01','2013-01-01','2013-01-01','2013-01-01','2014-01-01','2014-01-01',
'2014-01-01','2015-01-01','2015-01-01','2015-01-01','2016-01-01','2016-01-01',
'2017-01-01','2018-01-01','2019-01-01']
df = pd.DataFrame(lst, columns=['Date'])
plt.hist(df["Date"]) # daily data
plt.show()
要解决这个问题,您应该将日期列从 str
转换为 datetime
并查看绘图的样子:
df = pd.DataFrame(lst, columns=['Date'])
df["Date"] =pd.to_datetime(df["Date"]) # add this line before plotting
plt.hist(df["Date"])
plt.show()
如果您想以 .svg 格式保存直方图,您应该以这种方式直接在图后添加此行:
plt.hist(df["Date"])
plt.savefig("test.svg") # add your line directly after plot.hist()
plt.show()
最后说明:现在您可以顺利使用附加设置来设置您喜欢的x-axis,这是一个例子:
ax.xaxis.set_major_locator(mdates.YearLocator(2)) # show every 2 years on the x-axis
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%b'))
所以我有数据作为读数记录为一段时间内的月平均值。我已经画好了,但问题是图形有点乱,X 轴不可读,我已经尝试了两天没有成功绘制它,任何帮助将不胜感激。我能够使用完全相同的代码从 plotly 中获得我想要的图像,而不是使用“iplot”而不是“plot”进行绘图,您可以在第二张图像中看到结果。但问题是我无法将它导出为 SVG,此外我真的很喜欢 matplotlib,所以我想使用它。代码在最后,我还应该注意所有注释掉的行都是失败的尝试。
这是我得到的图表:
这是我想要的图像:
最后是代码:
fig, ax= plt.subplots(1,1)
# ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))
ax=hist.count().plot(kind='bar', color='brown', legend=True)
# ax.xaxis.set_major_locator(matplotlib.dates.YearLocator(10))
# ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("\n%Y"))
# plt.setp(ax.get_xticklabels(), rotation=0, ha="center")
# ax.xaxis.set_major_formatter(DateFormatter("%Y"))
# fig.autofmt_xdate()
# plt.xticks(hist['Date'], rotation=90)
plt.show()
这是数据的先前状态(按 WellCode 分组): enter image description here
这是在每年对它们进行分组之后,基本上为出现分布制作直方图:
{Timestamp('1888-12-31 00:00:00', freq='A-DEC'): 1,
Timestamp('1889-12-31 00:00:00', freq='A-DEC'): 1,
Timestamp('1890-12-31 00:00:00', freq='A-DEC'): 1,
Timestamp('1891-12-31 00:00:00', freq='A-DEC'): 1,
Timestamp('1892-12-31 00:00:00', freq='A-DEC'): 1,
....................
Timestamp('2000-12-31 00:00:00', freq='A-DEC'): 411670,
Timestamp('2001-12-31 00:00:00', freq='A-DEC'): 423100,
Timestamp('2002-12-31 00:00:00', freq='A-DEC'): 434910,
Timestamp('2003-12-31 00:00:00', freq='A-DEC'): 447776,
Timestamp('2004-12-31 00:00:00', freq='A-DEC'): 460983,
Timestamp('2005-12-31 00:00:00', freq='A-DEC'): 475415,
Timestamp('2006-12-31 00:00:00', freq='A-DEC'): 490284,
Timestamp('2007-12-31 00:00:00', freq='A-DEC'): 505549}
你有这个小数据,你想得到这个数据的直方图如下:
import matplotlib.pyplot as plt
lst = ['2010-01-01','2011-01-01','2011-01-01','2012-01-01','2012-01-01','2012-01-01',
'2013-01-01','2013-01-01','2013-01-01','2013-01-01','2014-01-01','2014-01-01',
'2014-01-01','2015-01-01','2015-01-01','2015-01-01','2016-01-01','2016-01-01',
'2017-01-01','2018-01-01','2019-01-01']
df = pd.DataFrame(lst, columns=['Date'])
plt.hist(df["Date"]) # daily data
plt.show()
要解决这个问题,您应该将日期列从 str
转换为 datetime
并查看绘图的样子:
df = pd.DataFrame(lst, columns=['Date'])
df["Date"] =pd.to_datetime(df["Date"]) # add this line before plotting
plt.hist(df["Date"])
plt.show()
如果您想以 .svg 格式保存直方图,您应该以这种方式直接在图后添加此行:
plt.hist(df["Date"])
plt.savefig("test.svg") # add your line directly after plot.hist()
plt.show()
最后说明:现在您可以顺利使用附加设置来设置您喜欢的x-axis,这是一个例子:
ax.xaxis.set_major_locator(mdates.YearLocator(2)) # show every 2 years on the x-axis
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%b'))