首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用多列熊猫绘制堆叠条形图

用多列熊猫绘制堆叠条形图
EN

Stack Overflow用户
提问于 2017-06-18 23:13:03
回答 2查看 280关注 0票数 2

我有两个数据,我需要得到的差异,然后把其中一个在这个差异之上。下面是一个很小的例子:

代码语言:javascript
复制
import pandas as pd
import matplotlib.pyplot as plt

df1 = pd.DataFrame([[2,5,7,6,7],[4,4,4,4,3],[8,8,7,3,4],[16,10,12,13,16]], columns=["N", "A", "B", "C", "D"])
df2 = pd.DataFrame([[2,1,3,6,5],[4,1,2,3,2],[8,2,2,3,3],[16,8,10,3,11]], columns=["N", "A", "B", "C", "D"])

dfDiff = df1 - df2
dfDiff['N'] = df1['N']

# Individual barchart
colors = ['#6c8ebf', '#82b366', '#F7A01D', '#9876a7']
df1.set_index('N')[["A", "B", "C", "D"]].plot.bar(color=colors)
df2.set_index('N')[["A", "B", "C", "D"]].plot.bar(color=colors)

dfStacked = pd.DataFrame(columns=["N", "A", "A_diff", "B", "B_diff"])
dfStacked["N"] = df2["N"]
dfStacked["A"] = df2["A"]
dfStacked["B"] = df2["B"]
dfStacked["C"] = df2["C"]
dfStacked["D"] = df2["D"]
dfStacked["A_diff"] = dfDiff["A"]
dfStacked["B_diff"] = dfDiff["B"]
dfStacked["C_diff"] = dfDiff["C"]
dfStacked["D_diff"] = dfDiff["D"]

dfStacked.set_index('N').plot.bar(stacked=True)

plt.show()

数据格式如下所示:

问题是,现在新堆叠的东西都合并了。我想让"A“与"A_diff”、"B“、"B_diff”堆叠在一起,"C“与"C_diff”堆叠在一起,D与"D_diff“堆叠在一起。

例如,我将代码改为" A“和"A_diff”作为dfStacked.set_index('N')[["A", "A_diff"]].plot.bar(stacked=True),这看起来是正确的,但我希望A、B、C和D在前两个数字中按N分组。

为此,我需要一个新的数据格式吗,比如dfStacked?如果是,应以何种形式添加内容?如何保持相同的颜色,但为“顶部”堆叠栏添加hatch="/" only呢?

以下数据是否更好?:

代码语言:javascript
复制
df3 = pd.DataFrame(columns=["N", "Algorithm", "df1", "dfDiff"])
df3.loc[len(df3)] = [2, "A", 20, 10]
df3.loc[len(df3)] = [2, "A", 1, 4]
df3.loc[len(df3)] = [4, "A", 2, 3]
df3.loc[len(df3)] = [4, "A", 3, 4]
df3.loc[len(df3)] = [2, "B", 1, 3]
df3.loc[len(df3)] = [2, "B", 2, 4]
df3.loc[len(df3)] = [4, "B", 3, 3]
df3.loc[len(df3)] = [4, "B", 4, 2]

但是如何按照"N“和”算法“对它们进行分组呢?我的意思是,每一行对应于一个条形,只是它们应该与所有的“算法”一起按"N“分组,最后两列是每条的两个”部分“。最好是颜色匹配前两个数字(对于“算法”),但顶部的部分有hatch="/",例如。

谢谢你的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-24 18:09:12

我将从df1df2开始,以稍微不同的方式获得dfStacked

代码语言:javascript
复制
import pandas as pd

df1 = pd.DataFrame(
    [
        [2,5,7,6,7],
        [4,4,4,4,3],
        [8,8,7,3,4],
        [16,10,12,13,16]
    ], 
    columns=["N", "A", "B", "C", "D"]
).set_index('N')

df2 = pd.DataFrame(
    [
        [2,1,3,6,5],
        [4,1,2,3,2],
        [8,2,2,3,3],
        [16,8,10,3,11]
    ], 
    columns=["N", "A", "B", "C", "D"]
).set_index('N')

dfStacked = pd.concat(
    [df1, df1-df2], 
    axis=1, 
    keys=['raw','diff']
).reorder_levels([1,0], axis=1)

现在我们有了这个DataFrame

要将这些数据绘制成由第一层叠加的条形图,我们可以使用DataFrame.plot的两个特性-- axbottom。第一个是绘制条形图的轴的位置,第二个是条形底线应该开始的值的位置。要获得详细信息,可以使用help(plt.bar)阅读bottomhelp(pd.DataFrame.plot)来阅读ax

代码语言:javascript
复制
import matplotlib.pyplot as plt
from matplotlib.colors import TABLEAU_COLORS

plt.figure(figsize=(10,7))
ax = plt.gca()

names = dfStacked.columns.levels[0]
n = len(names)
color = iter(TABLEAU_COLORS)
w = 1/(n+2)       # width
h = '/'*5         # hatch for diff values
for i, name in enumerate(names):
    c = next(color)   # color
    p = n/2 - i       # position
    dfStacked[name]['raw'].plot.bar(
        ax=ax, 
        position=p, 
        width=w, 
        color=c,
        label=f'{name} raw'
    )
    dfStacked[name]['diff'].plot.bar(
        ax=ax, 
        bottom=dfStacked[name]['raw'], 
        hatch=h,
        position=p,
        width=w, 
        color=c,
        label=f'{name} diff'
    )

ax.set_xlim([-1, n])
ax.tick_params(axis='x', rotation=0)
ax.legend();

这是输出:

票数 2
EN

Stack Overflow用户

发布于 2022-08-25 02:35:04

IIUC,尝试在position中使用pd.DataFrame.plot.bar参数:

代码语言:javascript
复制
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df1 = pd.DataFrame([[2,5,7,6,7],[4,4,4,4,3],[8,8,7,3,4],[16,10,12,13,16]], columns=["N", "A", "B", "C", "D"])
df2 = pd.DataFrame([[2,1,3,6,5],[4,1,2,3,2],[8,2,2,3,3],[16,8,10,3,11]], columns=["N", "A", "B", "C", "D"])

dfDiff = df1 - df2
dfDiff['N'] = df1['N']

dfStacked = pd.DataFrame(columns=["N", "A", "A_diff", "B", "B_diff"])
dfStacked["N"] = df2["N"]
dfStacked["A"] = df2["A"]
dfStacked["B"] = df2["B"]
dfStacked["C"] = df2["C"]
dfStacked["D"] = df2["D"]
dfStacked["A_diff"] = dfDiff["A"]
dfStacked["B_diff"] = dfDiff["B"]
dfStacked["C_diff"] = dfDiff["C"]
dfStacked["D_diff"] = dfDiff["D"]

dfStacked = dfStacked.set_index('N')

colors = ['red', 'slateblue', 'lightseagreen', 'orange']
colors_c = ['darkred', 'blue', 'darkgreen', 'darkorange']

ax = dfStacked.filter(like='A').plot.bar(stacked=True, position=2, width=.1, color=[colors[0], colors_c[0]], edgecolor='w', alpha=.8)
dfStacked.filter(like='B').plot.bar(stacked=True, ax=ax, position=1, width=.1, color=[colors[1], colors_c[1]], edgecolor='w', alpha=.8)
dfStacked.filter(like='C').plot.bar(stacked=True, ax=ax, position=0, width=.1, color=[colors[2], colors_c[2]], edgecolor='w', alpha=.8)
dfStacked.filter(like='D').plot.bar(stacked=True, ax=ax, position=-1, width=.1, color=[colors[3], colors_c[3]], edgecolor='w', alpha=.8)
ax.set_xlim(-.5,3.5)

plt.legend(loc='upper center', ncol=4, bbox_to_anchor=(.5, 1.2))
plt.show()

输出:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44620396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档