График сложенной области в Python с положительными и отрицательными значениями - PullRequest
0 голосов
/ 18 октября 2018

Я хотел бы сделать график с областями с накоплением, где некоторые группы положительны, поэтому будут отображаться над осью X (с накоплением), а другие отрицательны, поэтому будут отображаться под осью X.В тот момент, когда я делаю стековую диаграмму, она просто добавляет фактические значения, поэтому группа с отрицательными значениями в не появляется на графике, а все остальные области смещаются вниз.По сути, я хочу объединить два графика площадей, один для положительных групп выше оси X и один для отрицательных групп ниже оси X.

Ответы [ 2 ]

0 голосов
/ 17 августа 2019

Возможно, это не совсем то, что вы искали, но мне удалось построить участок с отрицательными и положительными значениями.Приведенный ниже код работает на Python 3.7 / Windows 10 / Spyder IDE:

import matplotlib.pyplot as plt

x_axis = [1,2,3,4,5,6,7,8,9,10]
cheap = [-5,-4,-6,-8,-4,-2,-4,-8,-7,-3]
expensive = [3,4,8,7,9,6,4,3,2,3]


fig_size = plt.rcParams["figure.figsize"] #set chart size (longer than taller)
fig_size[0] = 39
fig_size[1] = 10
plt.rcParams["figure.figsize"] = fig_size
plt.rcParams.update({'font.size': 18}) 

plt.stackplot(x_axis, expensive, colors=['r'])
plt.stackplot(x_axis, cheap, colors=['g'])

plt.plot([],[],color='r', label='Above great case', linewidth=5)
plt.plot([],[],color='g', label='Below low case', linewidth=5)
plt.legend()

plt.xlabel('Years')
plt.ylabel('Number of companies')
plt.title('Under/over valuation over time')
plt.show()

Диаграмма, которую вы должны увидеть: enter image description here

Эта процедура фактически использовалась дляпостроить диаграмму с тысячами точек данных оси X.Я попробовал перед гистограммой, и это заняло намного больше времени, чем эта версия области.Ниже приведен пример реального графика:

enter image description here

0 голосов
/ 25 июля 2019

Предположим, у вас есть пандас DataFrame df с группами в виде столбцов, тогда можно сделать что-то вроде:

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
# split dataframe df into negative only and positive only values
df_neg, df_pos = df.clip(upper=0), df.clip(lower=0)
# stacked area plot of positive values
df_pos.plot.area(ax=ax, stacked=True, linewidth=0.)
# reset the color cycle
ax.set_prop_cycle(None)
# stacked area plot of negative values, prepend column names with '_' such that they don't appear in the legend
df_neg.rename(columns=lambda x: '_' + x).plot.area(ax=ax, stacked=True, linewidth=0.)
# rescale the y axis
ax.set_ylim([df_neg.sum(axis=1).min(), df_pos.sum(axis=1).max()])
...