2013-06-01 30 views
9

ile% 100 yığılmış alan grafiği oluşturma Matplotlib'de% 100 yığılmış alan şemasının nasıl oluşturulacağını merak ediyordum. Matplotlib sayfasında bunun için bir örnek bulamadım.matplotlib

Burada birileri bana nasıl ulaşılacağını gösterebilir?

+3

Bu nasıl [örneğin] hakkında (http://matplotlib.org/examples/pylab_examples/stackplot_demo.html)? –

+1

Hiçbir şey denediniz mi? Çoğunlukla çalışan bir kod varsa, SO üzerinde daha iyi bir yanıt alırsınız. Bu soru olduğu gibi okur ve 'lütfen çalışmamı benim için yap'. @LogicalKnight'ın işaret ettiği örnek iyi bir başlangıçtır ve yolun% 95'ini alır. – tacaswell

cevap

17

Bunun için basit bir şekilde ben, örneğin olduğu gibi, bir dizi içinde düzenlenmiş y değerlerine sahip olduğunu varsayalım 100.

her x-değeri, y değerlerinin toplamı olduğundan emin olmak için bir aşağıda,

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

kolon toplamları onun sütun toplamları ile y dizi bölmek gerekir, 100, ve daha sonra çok-katlı 100 ile bu yapım, y değeri 0 ile 100 kapsar yapar emin olmak için, yani y ekseninin yüzde "birimi". Y ekseninin değerlerini 0'dan 1'e kadar aralığını istiyorsanız, 100 ile çarpmayın.

Yukarıdaki gibi tek dizisinde düzenlenmiş y değerleriniz olmasa bile prensip aynıdır; y-değerlerinden (örneğin, y1, y2, vb.) oluşan her dizide karşılık gelen elemanlar, 100 (veya 1) olarak özetlenmelidir.

Aşağıdaki kod, yorumuna bağlı olarak example @LogicalKnight öğesinin değiştirilmiş bir sürümüdür.

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

Bu, aşağıda gösterilen çıktıyı verir.

enter image description here

+0

Doğru yardım için çok teşekkürler! Şu anda mpl 1.2.1 ve numpy ile ilk etapta verileri çizmek için biraz mücadele ediyorum ve bu konuya tekrar bakmak için zamanım olmadı. Bu yüzden, bu güzel kod parçasını aldığım için çok mutluyum! Alkış Thomas –

+0

Ben şimdi kendimi grafik yığınını üretmek için bu yöntemi denedim ve bir istisna ben stackplot 'traceback (son En son çağrı) aramak için denemek her zaman atılıyor: Dosya "", satır 1, ax.stackplot (basınçlar) AttributeError: 'AxesSubplot' nesnesinde 'stackplot' özelliği yok –

+1

@Magic_Matt_Man Python ve Matplotlib hangi sürümlerini kullanıyorsunuz? Ubuntu Linux 64-bit dağıtımında – hooy