2013-06-01 3 views
9

matplotlib에 100 % 스택 차트를 만드는 방법이 궁금합니다. matplotlib 페이지에서 예제를 찾을 수 없었습니다.matplotlib로 100 % 스택 차트 작성

누군가 여기서 어떻게 달성 할 수 있는지 보여 줄 수 있습니까?

+3

방법이 실시 예 내지 약 (http://matplotlib.org/examples/pylab_examples/stackplot_demo.html)? –

+1

시도해 보셨습니까? 대부분 작업 코드가있는 경우 일반적으로보다 나은 응답을 얻을 수 있습니다. 그것이 의미하는 바대로이 질문은 '나를 위해 제 일을 해주십시오'라고 읽습니다. @LogicalKnight가 지적한 예제는 좋은 시작이며 거기에서 95 %를 얻습니다. – tacaswell

답변

17

이를위한 간단한 방법은 I는 예에서와 같이 어레이 구성의 y 값을 갖는 것으로 가정 100

마다, X 값에 대해 y 값을 합계가 있는지 확인한다 아래

y = np.array([[17, 19, 5, 16, 22, 20, 9, 31, 39, 8], 
       [46, 18, 37, 27, 29, 6, 5, 23, 22, 5], 
       [15, 46, 33, 36, 11, 13, 39, 17, 49, 17]]) 

이 열 합계 당신은 그것의 열 합계에 의해 y 배열을 분할해야합니다, (100), 그리고 다음 곱하기 (100)에 의해이 만드는 y 값이 0에서 100에 걸쳐 수 있는지 확인하기 위해, 즉 y 축의 「단위」퍼센트. y 축의 값을 0에서 1까지의 간격으로 확장하려면 100을 곱하면 안됩니다.

y 값이 인 경우에도 위와 같이 배열이입니다. , 원칙은 동일합니다. y 값으로 구성된 각 배열의 해당 요소 (예 : y1, y2 등)의 합계는 100 (또는 1)이어야합니다.

아래 코드는 @LogicalKnight의 수정 된 버전입니다. @LogicalKnight는 그의 코멘트에 링크되어 있습니다.

import numpy as np 
from matplotlib import pyplot as plt 

fnx = lambda : np.random.randint(5, 50, 10) 
y = np.row_stack((fnx(), fnx(), fnx())) 
x = np.arange(10) 

# Make new array consisting of fractions of column-totals, 
# using .astype(float) to avoid integer division 
percent = y/y.sum(axis=0).astype(float) * 100 

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

ax.stackplot(x, percent) 
ax.set_title('100 % stacked area chart') 
ax.set_ylabel('Percent (%)') 
ax.margins(0, 0) # Set margins to avoid "whitespace" 

plt.show() 

다음과 같은 결과가 표시됩니다.

enter image description here

+0

적절한 도움을 주셔서 감사합니다. 나는 현재 mpl 1.2.1과 약간의 싸움을하고 있으며 데이터를 처음부터 계획하고 numpy는이 문제를 다시 볼 시간이 없다. 따라서이 멋진 코드를 얻게되어 정말 기쁩니다! 건배 토마스 –

+0

나는 지금 나 자신 차트 스택을 생산하는이 방법을 시도했습니다, 예외는 내가 stackplot '역 추적 (마지막으로 가장 최근 통화)를 호출하려고 할 때마다 발생되는 : 파일 ""를, 줄 1, ax.stackplot (압력)AttributeError : 'AxesSubplot'객체에 'stackplot'속성이 없습니다. –

+1

@Magic_Matt_Man 어떤 Python 및 Matplotlib 버전을 사용하고 있습니까? – hooy