具有多系列的Python堆叠条形图
我需要创建一个类似下图的图表,一系列堆叠的条形图。有些值为正值,有些值为负值。我希望图表的显示方式与excel中的堆叠条形图一样,它向上堆叠正值,向下堆叠负值。 对于N个类别,是否有一种简单的方法可以做到这一点 以下是一些示例数据:具有多系列的Python堆叠条形图,python,matplotlib,charts,bokeh,seaborn,Python,Matplotlib,Charts,Bokeh,Seaborn,我需要创建一个类似下图的图表,一系列堆叠的条形图。有些值为正值,有些值为负值。我希望图表的显示方式与excel中的堆叠条形图一样,它向上堆叠正值,向下堆叠负值。 对于N个类别,是否有一种简单的方法可以做到这一点 以下是一些示例数据: df = pd.DataFrame(index=['06-11-2018', '06-12-2018', '06-13-2018', '06-14-2018', '06-15-2018'], data={'A': [-378,
df = pd.DataFrame(index=['06-11-2018', '06-12-2018', '06-13-2018', '06-14-2018', '06-15-2018'],
data={'A': [-378, -2347, 509, 987, 513],
'B': [-527, -2599, 765, 533, 670],
'C': [-2343, -2273, 2093, 2197, 1990],
'D': [-1845, -1853, 3325, 1306, 2160]})
数据框的
绘图
函数按照您描述的方式处理负值。如果我们将数据框中的某些值更改为负值,则该行
df.plot(kind="bar", stacked=True)
给了我们这个图表:
我们可以添加一条与问题图像中的黑线类似的“总计”线,方法是将数据框的行相加,并将返回的系列
对象绘制在与条形图相同的轴上:
生成第二个图表的代码如下所示
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame(index=['06-11-2018', '06-12-2018', '06-13-2018',
'06-14-2018', '06-15-2018'],
data={'A': [-378, 2347, 509, 987, 513],
'B': [527, 2599, -765, 533, 670],
'C': [2343, -2273, 2093, -2197, 1990],
'D': [1845, 1853, -3325, 1306, 2160]})
ax = df.plot(kind="bar", stacked=True)
df.sum(axis=1).plot(ax=ax, color="k")
plt.show()
数据框的plot
函数按照您描述的方式处理负值。如果我们将数据框中的某些值更改为负值,则该行
df.plot(kind="bar", stacked=True)
给了我们这个图表:
我们可以添加一条与问题图像中的黑线类似的“总计”线,方法是将数据框的行相加,并将返回的系列
对象绘制在与条形图相同的轴上:
生成第二个图表的代码如下所示
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame(index=['06-11-2018', '06-12-2018', '06-13-2018',
'06-14-2018', '06-15-2018'],
data={'A': [-378, 2347, 509, 987, 513],
'B': [527, 2599, -765, 533, 670],
'C': [2343, -2273, 2093, -2197, 1990],
'D': [1845, 1853, -3325, 1306, 2160]})
ax = df.plot(kind="bar", stacked=True)
df.sum(axis=1).plot(ax=ax, color="k")
plt.show()
谢谢,这很有效,但是有没有办法在这个图表上画一条“总”线呢?我尝试使用.plot()
方法返回的axes
对象,但没有成功。@GustavaAmarante当然,假设您已将返回的axes
对象分配给名为ax
的变量,则可以执行df.sum(axis=1)plot(ax=ax,color=“k”)
(我指定了线条的颜色,因为如果没有它,它将返回到颜色循环的开始,并且蓝色已经在条形图上使用)。不幸的是,这不起作用。代码运行时没有任何错误或警告,但图表根本不会更新。我尝试了颠倒顺序(先绘制线条,然后绘制条形图)但同样的事情发生了,它不会在第二个系列中更新。@GustavoAmarante我已经编辑了答案以显示总行数。看看你的代码与我的代码相比如何:如果代码相同,但你仍然看不到行数,我想你正在问一个新问题。谢谢,这很有效,但有办法得出“总行数”吗此图表上方的线条?我尝试使用.plot()
方法返回的axes
对象,但没有成功。@GustavaAmarante当然,假设您已将返回的轴
对象分配给名为ax
的变量,您可以执行df.sum(axis=1)。plot(ax=ax,color=“k”)
(我指定了线条的颜色,因为如果没有它,它将返回到颜色循环的开始,并且蓝色已经在条形图上使用)。不幸的是,这不起作用。代码运行时没有任何错误或警告,但图表根本不会更新。我尝试了颠倒顺序(先绘制线条,然后绘制条形图)但同样的事情发生了,它不会在第二个系列中更新。@GustavoAmarante我编辑了答案以显示总行数。看看你的代码与我的代码相比如何:如果代码相同,但你仍然看不到行数,我想你是在问一个新问题。