pandas 每个x刻度上有多个条形的堆叠条形图

n53p2ov0  于 2023-04-10  发布在  其他
关注(0)|答案(1)|浏览(99)

我正在尝试创建一个堆叠条形图。我提供的代码几乎是我想要做的,即有12个x值,每个月一个,每组4个条形图,每年一个。我试图实现的唯一区别是将条形图堆叠起来,不同的颜色来自颜色字典,每个PC值一个。所以最终的图,我应该有确切的数量的酒吧,在相同的确切位置,但每个酒吧应该是一个堆叠版本的当前之一。这甚至是可能的?如果这是不可能的,你有其他的想法,如何有人可以直观地表示变化和金额的PC值为每个月,每年,我很高兴听到你的建议

import pandas as pd
import random
import matplotlib.pyplot as plt

N=100
pc_col = [random.randint(1,7) for i in range(N)]
year_col = [random.randint(2020,2023) for i in range(N)]
month_col = [random.randint(1,12) for i in range(N)]

data = {'PC': pc_col, 'Year': year_col, 'Month': month_col}
data = pd.DataFrame(data)

counts = data.groupby(['Month', 'Year']).size().unstack()
counts.plot(kind='bar')

plt.xlabel('Month')
plt.ylabel('Count')
plt.title('Counts by Month and Year')

plt.show()

我已经尝试了不同的group_by方法的堆栈参数,但它似乎并没有真正做我想要的。我也发现了这个Pandas: Stacked bar plot with adjacent bars,但这样,x-tick标签放错了位置。我也发现了这个Multiple stacked bar plot with pandas,但在我的情况下,我不知道默认情况下数据集将有多少年

0s0u357o

0s0u357o1#

我不是很确定,但看看这是不是你要找的。
1.我把整个条形图放在一个FOR循环中,每个循环代表一年
1.分组时,使用PC沿着月份和年份
1.从索引中删除Year(使用xs索引1)
1.绘制此条形图(每年一个图)
1.根据1/年数调整宽度和位置
1.在第一次运行期间读取图例,并仅用此替换(无重复)
我想我假设第一年有所有PC值的数据,但除此之外,希望这应该起作用。希望这有帮助...

N=100
pc_col = [random.randint(1,7) for i in range(N)]
year_col = [random.randint(2020,2023) for i in range(N)]
month_col = [random.randint(1,12) for i in range(N)]
color=['red', 'green', 'blue', 'yellow', 'black', 'orange', 'magenta']
data = {'PC': pc_col, 'Year': year_col, 'Month': month_col}
data = pd.DataFrame(data)
fig, ax = plt.subplots()
barwidth=0.5/data.Year.nunique()
for i, yr in enumerate(sorted(data.Year.unique())):
    data.groupby(['Month', 'Year', 'PC']).size().xs(yr, level=1, drop_level=True).unstack().\
    plot(ax=ax, kind='bar', stacked='True', width=barwidth, position=i)
    if i == 0:
        h,l = ax.get_legend_handles_labels()

ax.get_legend().remove()
ax.legend(h,l)

相关问题