matplotlib 如何在子图中创建具有共享属性且没有共享属性的hbar?

gkn4icbw  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(127)

我的输入是一个点阵df(你可以在我的问题末尾找到一个片段),我试图创建一个类似于第二个“面板供应商条形图”的图:https://peltiertech.com/stacked-bar-chart-alternatives
我做的代码是这样的(顺便说一下,我对任何改进它的网站都持开放态度):

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_excel('my_folder/list_of_softwares.xlsx')

sums = df.groupby('Software').sum().T

fig, axes = plt.subplots(1, len(sums.index), sharey=True, figsize=(12, 3))
plt.subplots_adjust(wspace=0)

colors = ['#6caddf', '#f27077', '#9dd374', '#fab26a']
          
for ax, software, parameter, color in zip(axes, sums.columns, sums.index, colors):
    ax.barh(sums.loc[parameter].index, sums.loc[parameter].values, color=color)
    ax.set(xticks=range(0, df.drop('Software', axis=1).max().max()+1, 2000), title=parameter)

fig.suptitle('Summary of Softwares', y=1.05, fontweight='bold')

plt.show()

它的工作原理除了4个小问题:
1.应删除所有轴中的y刻度
1.轴的副标题应该在图的内部而不是外部
1.某些x刻度标签重叠
1.分隔每把斧头的垂直线应该去掉
我觉得这很容易做到,但我不知道怎么做。
有什么想法吗,伙计们?

df看起来像这样:

Software  Parameters  Reports  Dashbords  Scorecards
0   Tableau        7935       68        474         712
1   Tableau          69      518        695         122
2    Oracle         651      540        842         764
3    Oracle         700       52        776         948
4    Oracle         758      862        182         757
5       IBM         999      271        847         338
6       IBM         316      128        395         441
7       IBM         915      199       1000         747
8       IBM          44      685        818         427
9     Tibco         500      575        876         450
10    Board         748      936        367         771
11    Board         304      700        856          77
12    Board         623      974        120         802
13    Board         131      151        395         410
14    Board         217      645        996         537
15  LogiXML         630      779        752         433
16  LogiXML         947      391        280         109
ni65a41a

ni65a41a1#

你只需要调整ax对象的一些简单的单独设置,这是每个单独的图:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_clipboard() # copy data in the SO question
sums = df.groupby('Software').sum().T

fig, axes = plt.subplots(1, len(sums.index), sharey=True, figsize=(12, 3))
plt.subplots_adjust(wspace=0.2)

colors = ['#6caddf', '#f27077', '#9dd374', '#fab26a']
          
for ax, software, parameter, color in zip(axes, sums.columns, sums.index, colors):
    ax.barh(sums.loc[parameter].index, sums.loc[parameter].values, color=color)
    ax.set(xticks=range(0, df.drop('Software', axis=1).max().max()+1, 2000), )
    ax.set_title(parameter, y=0.9)
    ax.yaxis.set_tick_params(length=0)
    for d in ["top", "bottom", "right", "left"]:
        ax.spines[d].set_visible(False)
    
    
fig.suptitle('Summary of Softwares', y=1.05, fontweight='bold')

plt.show()

相关问题