我正在使用以下方法制作堆积条形图:
DataFrame.plot(kind='bar',stacked=True)
我想控制条形的宽度,使条形像直方图一样相互连接。
我查看了文档但无济于事 - 有什么建议吗?有可能这样做吗?
我正在使用以下方法制作堆积条形图:
DataFrame.plot(kind='bar',stacked=True)
我想控制条形的宽度,使条形像直方图一样相互连接。
我查看了文档但无济于事 - 有什么建议吗?有可能这样做吗?
对于遇到这个问题的任何人:
从 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=
参数来更改图形大小。
如果认为您必须使用 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()
代码
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