使用python matplotlib获得正负值的堆积条形图

时间:2016-03-14 04:59:55

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

我正在尝试使用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?

我已经使用此代码在matthon中使用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()

上面的代码给出了以下图表:

enter image description here

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

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

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

1 个答案:

答案 0 :(得分:3)

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()

这是结果图:

See Pointsize, Density and the Actual Font Size usage examples