46

我正在使用以下方法制作堆积条形图:

DataFrame.plot(kind='bar',stacked=True)

我想控制条形的宽度,使条形像直方图一样相互连接。

我查看了文档但无济于事 - 有什么建议吗?有可能这样做吗?

4

4 回答 4

90

对于遇到这个问题的任何人:

从 pandas 0.14 开始,用条形图有一个“宽度”命令: https ://github.com/pydata/pandas/pull/6644

上面的例子现在可以简单地通过使用来解决

df.plot(kind='bar', stacked=True, width=1)

pandas.DataFrame.plot.bar或。pandas.DataFrame.plot_kind='bar'

更改条形的宽度时,也可以通过指定figsize=参数来更改图形大小。

于 2014-12-05T17:46:24.480 回答
16

如果认为您必须使用 matplotlib 对条形图进行“后处理”,因为 pandas 在内部设置条形的宽度。

形成条形的矩形位于容器对象中。因此,您必须遍历这些容器并分别设置矩形的宽度:

In [208]: df = pd.DataFrame(np.random.random((6, 5)) * 10,               
                        index=list('abcdef'), columns=list('ABCDE'))

In [209]: df
Out[209]: 
     A    B    C    D    E
a  4.2  6.7  1.0  7.1  1.4
b  1.3  9.5  5.1  7.3  5.6
c  8.9  5.0  5.0  6.7  3.8
d  5.5  0.5  2.4  8.4  6.4
e  0.3  1.4  4.8  1.7  9.3
f  3.3  0.2  6.9  8.0  6.1

In [210]: ax = df.plot(kind='bar', stacked=True, align='center')

In [211]: for container in ax.containers:
              plt.setp(container, width=1)
   .....:         

In [212]: x0, x1 = ax.get_xlim()

In [213]: ax.set_xlim(x0 -0.5, x1 + 0.25)
Out[213]: (-0.5, 6.5)

In [214]: plt.tight_layout()

堆叠条.png

于 2013-02-12T23:14:31.553 回答
0

“我想控制条形的宽度,使条形像直方图一样相互连接。”

更好的选择是使用sns.displot()

示例代码:

emp = pd.read_csv("https://raw.githubusercontent.com/arora123/Data/master/emp-data.csv")

sns.displot(emp, x='Department', hue='Gender', multiple='stack',  
             height=8, aspect=1.7);

在此处输入图像描述

于 2021-03-24T03:44:44.653 回答
0

matplotlib 解决方案

根据 需要修改width参数ax.bar在此处输入图像描述

代码

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

df = pd.DataFrame(np.arange(15).reshape(5, 3), columns=list('ABC'))

print(df)

fig, axs = plt.subplots(1, 2)

ax = axs[0]
xs = np.arange(df.shape[1])
ys = np.zeros(xs.shape)
for ind in df.index:
    ax.bar(xs, df.loc[ind, :], label=ind, bottom=ys, width=.4)
    ys += df.loc[ind, :]
plt.setp(ax, xticks=xs, xticklabels=list(df))
ax.legend(title='rows')
ax.set_xlabel('columns')

ax = axs[1]
xs = np.arange(df.shape[0])
ys = np.zeros(xs.shape)
for col in list(df):
    ax.bar(xs, df.loc[:, col], label=col, bottom=ys, width=.4)
    ys += df.loc[:, col]
plt.setp(ax, xticks=xs, xticklabels=df.index.to_numpy().tolist())
ax.legend(title='columns')
ax.set_xlabel('rows')

plt.show()

df=

    A   B   C
0   0   1   2
1   3   4   5
2   6   7   8
3   9  10  11
4  12  13  14
于 2021-07-16T10:11:40.853 回答