2016-03-14 1 views
3

Я пытаюсь построить сложную гистограмму с питоном 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 для положительных и отрицательных значений

Я использовал этот код, чтобы построить столбчатую диаграмму в питона с 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

Теперь первый столбец построена правильно, так как она имеет все положительные значения, но когда питон работает на второй колонке, он получает все из-за отрицательных значений. Как я могу заставить его принять положительное дно при поиске положительных значений и отрицательного дна при построении дополнительных отрицательных значений?

+0

'p1' сам по себе работает так, как вы говорите, вы хотите. Распечатайте 'sum ([a])' ​​и сообщите мне, если это то, что вы хотите? Или вы хотите 'np.sum (a)'? Или ваша проблема в том, что все графики перекрываются? Затем см. Команду 'subplot (...)'. Возможно, вы могли бы нарисовать то, что хотите, чтобы результат выглядел. – roadrunner66

+0

Ваша проблема не очень ясна: что вы ожидаете в результате? –

+0

Это похоже на дублирующий вопрос: http://stackoverflow.com/questions/36766245/how-to-draw-100-stacked-bars-with-mixed-ve-and-ve-values-in-matplotlib – elke

ответ

1

Нижнее ключевое слово в ax.bar или plt.bar позволяет точно установить нижнюю границу каждого бара. Мы применяем нижнее значение 0-neg до отрицательных значений, а нижнее значение 0 - положительное.

Этот пример кода создает нужный сюжет:

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

Это Результирующий график:

Stacked barchart plot with pos/neg values in Matplotlib

Смежные вопросы