matplotlib 如何创建一些类别分组而一些类别堆叠的条形图

ilmyapht  于 2022-11-15  发布在  其他
关注(0)|答案(3)|浏览(231)

试图创建一个组合了堆积条形图和分组条形图的混合图表
下面是示例数据。

df = pd.DataFrame({
    'Categories': ["Two Instances", "Two Instances", "Two Instances"],
    'X': ["FS", "HRRS", "Sequential"],
    'Y': [146, 82, 80],
    'Y1': [157, 160, 162]
})

以下是当前条形图代码:

ax1 = plt.subplots()

ax1 = sns.barplot(x=df["X"], y=df["Y1"], color='#590D22', label="T2")
ax1 = sns.barplot(x=df["X"], y=df["Y"], color='#800F2F', label="T1")

plt.legend(bbox_to_anchor=(1, 1.02), loc='lower right', borderaxespad=0)
plt.show()

我试着将前两个条形图并排合并而不是堆叠。我只想顺序堆叠。其余的前两个FS和HRRS我试着这样做。

而第三个保持堆叠条形图。

xzv2uavs

xzv2uavs1#

这是我用海运图书馆解决这个问题的方法。
我创建了两个单独的数据集,其中包含一些虚拟值,这样我就可以完美地将它们重叠。这是一种变通方法,或者说这是唯一的方法。社区会喜欢更多的解决方案或完美的代码。以下是对我有效的方法。

data = {'Value': [146, 157, 82, 160, 0, 0],
        'Name': ['T1', 'T2',
                 'T1', 'T2',
                 'T1', 'T2'],
        'Param': ['FS', 'FS',
                  'HRRS', 'HRRS',
                  'Sequential', 'Sequential']}
df = pd.DataFrame(data)

df = df.sort_values(['Name', 'Param'])

df1 = pd.DataFrame({
    'X': ["FS", "HRRS", "Sequential"],
    'Y': [0, 0, 80],
    'Y1': [0, 0, 162]
})

plt.figure()
sns.barplot(x='Param', y='Value', data=df, hue='Name', palette='CMRmap_r')
sns.barplot(x=df1["X"], y=df1["Y1"], color='#ca8d24', label="T3", ax=None)
sns.barplot(x=df1["X"], y=df1["Y"], color='#783c88', label="T3", ax=None)
plt.show()

有了这个,我得到了不同类型的条形图的组合成一个。

7nbnzgx9

7nbnzgx92#

一种方法是使用补丁-创建分组条形图。然后,仅对于顺序条形图,移动它们使其堆叠。这将允许您在一个图中同时使用两种类型。

df = pd.DataFrame({'Categories': ["Two Instances", "Two Instances", "Two Instances"],
    'X': ["FS", "HRRS", "Sequential"],'Y': [146, 82, 80],'Y1': [157, 160, 162]})
fig, ax = plt.subplots(figsize=(10,5))

df.plot(x="X", kind='bar', ax=ax, color=['tab:blue', 'tab:orange'])

ax.patches[2].set_x(ax.patches[2].get_x()+0.125) ## Move Seq-Y bar to right
ax.patches[5].set_x(ax.patches[5].get_x()-0.125) ## Move Seq-Y1 bar to left
ax.patches[5].set_y(ax.patches[2].get_height())  ## Move Seq-Y1 bar up
ax.set_ylim(0, ax.patches[2].get_height()+ ax.patches[5].get_height() + 20) ##Adjust y-axis to show the taller Seq bar

plt.legend(labels=['T2', 'T1'], bbox_to_anchor=(1, 1.02), loc='lower right', borderaxespad=0, )
plt.show()

情节

jgzswidk

jgzswidk3#

不确定您是否希望完全切换绘图库,但这可能会以plotly关闭:

import pandas as pd
import plotly.express as px
df = pd.DataFrame({
    'Categories': ["Two Instances", "Two Instances", "Two Instances"],
    'X': ["FS", "HRRS", "Sequential"],
    'Y': [146, 82, 80],
    'Y1': [157, 160, 162]
})
dfFirstTwo = df.head(n=2)
dfThird = df.tail(n=1)
labels={'Y':'T1','Y1':'T2'}
fig = px.bar(dfThird, x='X',y=['Y','Y1'],labels={'Y':'T1','Y1':'T2'})
fig = fig.for_each_trace(lambda t: t.update(name=labels[t.name],
                                      legendgroup = labels[t.name],
                                      ))
fig = fig.update_layout(
    legend_title=""
)
fig.show()

import plotly.graph_objects as go
fig = go.Figure()

fig.add_trace(go.Bar(
    x=dfFirstTwo.X,
    y=dfFirstTwo.Y,
    name="T1",
    error_y=dict(
        type='data',
        array=(dfFirstTwo.Y)
    )
))

fig.add_trace(go.Bar(
    x=dfFirstTwo.X,
    y=dfFirstTwo.Y1,
    name="T2",
    error_y=dict(
        type='data',
        array=(dfFirstTwo.Y1)
    )
))

fig.update_layout(
    title="Plot Title",
    xaxis_title="X Axis Title",
    yaxis_title="X Axis Title",
    legend_title="",
)

相关问题