使用熊猫和Matplotlib将具有自定义DateTime索引的条形图分组

迈克尔·A

我想创建一个显示自定义日期时间索引的分组条形图-仅显示月份和年份而不是完整日期。我希望将这些条进行分组而不是堆叠。

我认为熊猫可以使用以下方法轻松解决此问题:

import pandas as pd
import matplotlib.pylab as plt
import matplotlib.dates as mdates

testdata = pd.DataFrame({"A": [1, 2, 3]
                       ,"B": [2, 3, 1]
                       , "C": [2, 3, 1]}  
                       ,index=pd.to_datetime(pd.DatetimeIndex(
                            data=["2019-03-02", "2019-04-01","2019-05-01"])))
ax = testdata.plot.bar()

这创建了我想要的情节,我想将日期更改为更简单的内容,例如2019年3月,2019年4月,2019年5月。分组的条形图,但x轴标签很烂

我假设使用自定义日期格式器可以工作,因此我尝试了

ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))

但是比我的标签完全消失了。这个问题意味着,大熊猫和DateFormatter有一点困难的关系。因此,我尝试使用Matplotlib基础知识来做到这一点:

fig, ax = plt.subplots()
width = 0.8
ax.bar(testdata.index, testdata["A"]) 
ax.bar(testdata.index, testdata["B"])
ax.bar(testdata.index, testdata["C"])
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))
plt.show()

现在,日期表示与预期的一样(尽管可以减少空格),但是数据重叠,这无济于事。 在此处输入图片说明

由于我使用的DateTime-Index,因此定义宽度并从x值中减去宽度(如通常建议的那样)将无济于事。我收到一个错误消息,不支持减去DatetimeIndes和float。

fig, ax = plt.subplots()
width = 0.8
ax.bar(testdata.index-width, testdata["A"]) 
ax.bar(testdata.index, testdata["B"])
ax.bar(testdata.index+width, testdata["C"])
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))
plt.show()

所以现在我的想法不多了,希望输入

广晃

原因之所以ax.xaxis.set_major_locator(mdates.MonthLocator())失败,是因为在引擎盖下,大熊猫将条形图绘制在上range(len(df)),然后相应地重命名刻度。

绘制后可以获取xticklabel并将其重新格式化:

ax = testdata.plot.bar()

ticks = [tick.get_text() for tick in ax.get_xticklabels()]
ticks = pd.to_datetime(ticks).strftime('%b %Y')
ax.set_xticklabels(ticks)

得到与ImpotanceOfBeingErnest相同的结果:

在此处输入图片说明

另一种可能更好的方法是移动每列的条形。当您有许多列并希望减少xticks的数量时,这种方法会更好。

fig, ax = plt.subplots()

# define the shift
shift = pd.to_timedelta('1D')

# modify the base of each columns, can do with a for loop
ax.bar(testdata.index + shift, testdata["A"]) 
ax.bar(testdata.index, testdata["B"])
ax.bar(testdata.index - shift, testdata["C"])
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))
plt.show()

输出:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何给熊猫/ matplotlib条形图自定义颜色

将分组条形图中每个条形图的颜色更改为自定义颜色

自定义多色水平条形图 matplotlib

如何自定义条形图(matplotlib)?

如何从自定义列表中使用带有XDDFDataSource值的Apache POI创建饼图和条形图

熊猫条形图中的自定义图例(matplotlib)

在Python中具有自定义宽度的条形图

具有自定义颜色范围的Plotly(R)条形图

具有对数刻度x轴的条形图的自定义科学轴单位

具有自定义渐变色的单堆积条形图

自定义条形图-将条形图与图表下方的表格对齐

使用带有 ggplot2、dplyr 和 forcats 的自定义函数绘制降频条形图

在Andorid中使用Achart自定义条形图

使用第二轴将线条图添加到使用自定义日期作为x刻度的条形图matplotlib

matplotlib中具有不同宽度和颜色的条形图(Mekko条形图)

自定义分组条形图ggplot上的条形颜色?

如何使用matplotlib绘制具有不同阴影和边缘颜色的条形图和图例?

matplotlib轴条形图由于从熊猫df索引x轴而无法将条形图彼此相邻绘制

分组条形图熊猫

显示自定义条形图/色带图,同时折叠条形以使用更少的线条

R中具有多个条形的分组条形图

如何使用matplotlib绘制复杂的条形图-具有多行条形的多个子图?

如何使用matplotlib绘制复杂的条形图-具有多行条形的多个子图?

在chart.js中使用带有月份和年份的自定义x轴绘制条形图时出现问题

船形图-自定义带有标签的条形图

matplotlib:为堆积条形图的每个组件提供自定义颜色

熊猫对条形图进行分组和重新采样:

使用danielgindi / ios-charts和Swift将条形图转换为分组的条形图

熊猫/ matplotlib条形图,其颜色由列定义