Как я могу создать линейный граф с помощью matplotlib? - PullRequest
43 голосов
/ 09 февраля 2010

Я бы хотел иметь возможность составлять линейный график с накоплением (аналогично методу здесь ) с Python (желательно с использованием matplotlib, но с другой библиотекой тоже все будет в порядке). Как я могу это сделать?

Это похоже на пример столбчатой ​​диаграммы на их веб-сайте, за исключением того, что я хотел бы, чтобы верхняя часть столбца была связана с отрезком линии, а область под ней была заполнена. Я мог бы приблизиться к этому, уменьшив промежутки между барами и используя много баров (но это похоже на хак, и, кроме того, я не уверен, возможно ли это).

Ответы [ 4 ]

55 голосов
/ 29 января 2014

Более новые версии matplotlib содержат функцию plt.stackplot, которая допускает несколько разных «готовых» графиков областей с накоплением:

import numpy as np
import pylab as plt

X = np.arange(0, 10, 1) 
Y = X + 5 * np.random.random((5, X.size))

baseline = ["zero", "sym", "wiggle", "weighted_wiggle"]
for n, v in enumerate(baseline):
    plt.subplot(2 ,2, n + 1)
    plt.stackplot(X, *Y, baseline=v)
    plt.title(v)
    plt.axis('tight')
plt.show()

Stack Plot using plt.stackplot.

49 голосов
/ 09 февраля 2010

Я полагаю, Площадь участка является общим термином для этого типа графика, и в конкретном случае, описанном в OP, График с накоплением .

Matplotlib не имеет функции "из коробки", которая сочетает и шаги обработки данных и рисования / рендеринга для создания этого типа графика, но вы легко можете сделать свой собственный из компонентов, поставляемых Matplotlib и NumPy.

Код ниже сначала складывает данные, затем рисует сюжет.

import numpy as NP
from matplotlib import pyplot as PLT

# just create some random data
fnx = lambda : NP.random.randint(3, 10, 10)
y = NP.row_stack((fnx(), fnx(), fnx()))   
# this call to 'cumsum' (cumulative sum), passing in your y data, 
# is necessary to avoid having to manually order the datasets
x = NP.arange(10) 
y_stack = NP.cumsum(y, axis=0)   # a 3x10 array

fig = PLT.figure()
ax1 = fig.add_subplot(111)

ax1.fill_between(x, 0, y_stack[0,:], facecolor="#CC6666", alpha=.7)
ax1.fill_between(x, y_stack[0,:], y_stack[1,:], facecolor="#1DACD6", alpha=.7)
ax1.fill_between(x, y_stack[1,:], y_stack[2,:], facecolor="#6E5160")

PLT.show()

example of stacked area plot

7 голосов
/ 09 февраля 2010

Немного менее хакерский способ - использовать линейный график и matplotlib.pyplot.fill_between. Чтобы подражать суммированию, вы должны сами сдвинуть очки.

x = np.arange(0,4)
y1 = np.array([1,2,4,3])
y2 = np.array([5,2,1,3])
# y2 should go on top, so shift them up
y2s = y1+y2

plot(x,y1)
plot(x,y2s)
fill_between(x,y1,0,color='blue')
fill_between(x,y1,y2s,color='red')
6 голосов
/ 15 мая 2017

Если у вас есть фрейм данных, это довольно просто:

df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df.plot.area();

enter image description here

От: Документация на панд

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...