【问题标题】:Stacked bar charts using python matplotlib for positive and negative values使用 python matplotlib 的堆积条形图用于正值和负值
【发布时间】:2016-08-11 23:05:51
【问题描述】:

我正在尝试使用 python Matplotlib 绘制堆积条形图,并且我有想要绘制的正值和负值。我看过其他关于如何绘制具有正值和负值的堆叠条形图的帖子,但没有一个使用 Matplotlib 完成,所以我找不到我的解决方案。 Stacked bar chart with negative JSON data d3.js stacked bar chart with positive and negative values Highcharts vertical stacked bar chart with negative values, is it possible?

我已经使用此代码在 python 中使用 matplotlib 绘制堆积条形图:

import numpy as np
import matplotlib.pyplot as plt
ind = np.arange(3)
a = np.array([4,-6,9])
b = np.array([2,7,1])
c = np.array([3,3,1])
d = np.array([4,0,-3])
p1 = plt.bar(ind, a, 1, color='g')
p2 = plt.bar(ind, b, 1, color='y',bottom=sum([a])) 
p3 = plt.bar(ind, c, 1, color='b', bottom=sum([a, b]))
p4 = plt.bar(ind, d, 1, color='c', bottom=sum([a, b, c]))
plt.show()

上面的代码给出了下图:

这并没有给我正确的结果。有人可以告诉我如何编码它是否使用额外的 if else 语句或任何其他可以在堆积条形图中绘制负值和正值的方式。

我希望得到如下图表所示的结果: expected chart

现在第一列被正确绘制,因为它具有所有正值,但是当 python 在第二列上工作时,由于负值而混淆了。在绘制其他负值时,如何在查看正值和负底部时获取正底部?

【问题讨论】:

  • p1 本身就可以按照您所说的方式工作。打印sum([a]) 并让我知道这是否是您想要的?或者你想要np.sum(a)?还是您的问题是所有图表都重叠?然后查看subplot(...) 命令。也许你可以画出你希望输出的样子。
  • 你的问题不是很清楚:你期望结果是什么?
  • 这似乎是一个重复的问题:stackoverflow.com/questions/36766245/…

标签: python matplotlib charts negative-number stacked-chart


【解决方案1】:

ax.bar 或 plt.bar 中的 bottom 关键字允许精确设置每个棒盘的下限。我们将 0-neg 底部应用于负值,将 0-pos 底部应用于正值。

此代码示例创建所需的图:

import numpy as np
import matplotlib.pyplot as plt

# Juwairia's data:     
a = [4,-6,9]
b = [2,7,1]
c = [3,3,1]
d = [4,0,-3]
data = np.array([a, b, c, d])

data_shape = np.shape(data)

# Take negative and positive data apart and cumulate
def get_cumulated_array(data, **kwargs):
    cum = data.clip(**kwargs)
    cum = np.cumsum(cum, axis=0)
    d = np.zeros(np.shape(data))
    d[1:] = cum[:-1]
    return d  

cumulated_data = get_cumulated_array(data, min=0)
cumulated_data_neg = get_cumulated_array(data, max=0)

# Re-merge negative and positive data.
row_mask = (data<0)
cumulated_data[row_mask] = cumulated_data_neg[row_mask]
data_stack = cumulated_data

cols = ["g", "y", "b", "c"]

fig = plt.figure()
ax = plt.subplot(111)

for i in np.arange(0, data_shape[0]):
    ax.bar(np.arange(data_shape[1]), data[i], bottom=data_stack[i], color=cols[i],)

plt.show()

这是结果图:

【讨论】:

  • 这应该是 plt.bar() 原生功能的一部分!
猜你喜欢
  • 2019-07-22
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 2018-12-17
相关资源
最近更新 更多