2012-01-05 28 views
6

point and figure chart yapmaya çalışıyorum. Terminalde yazdırmaya çalışabilirim ama matplotlib ile grafik oluşturmak istiyorum. Böyle bir şey yapmanın en iyi yolu ne olurdu? Dağınıklık düşünüyordum, ama bunu yaptığımda sütunlar çok uzaklara yayılıyor. Sütunların birbirine olabildiğince yakın olduğu yerde sağladığım bağlantıdan grafik gibi bir şey almak istiyorum. Bunu zorlamak için üzerine yazabileceğim bir parametre var mı? Matplotlib'i ilk kez kullandığınızda, lütfen bu önemsiz ise lütfen beni affedin. Teşekkürler.Matplotlib ile nokta ve şekil grafiği

+0

Eğer Jeff burada dinliyorsa, P & F grafiğini terminalde başarıyla bastığınızı söylemiştiniz. Sen yapar mısın? python kodunu (veya en azından mantığı) paylaşır mısınız? Python'da P & F grafiğini geliştirmeye çalışıyorum. Terminalde yazdırılabiliyorsa, onu HTML formatına almaya çalışacağım. Teşekkürler, – Vineet

+0

Hiç bir çalışma noktası ve çizilen grafik elde ettiniz mi. –

cevap

11

Bir dağılım grafiğinde kullanılan simgelerin boyutunu sparameter seçerek ayarlayabilirsiniz. Ayrıca, muhtemelen rakamınızın boyutunu (figsize ile) veya eksenlerinizin boyutlarını (add_axes ile) ayarlamanız gerekecektir. Bunun nedeni, scatter için sembollerin kare olması, görüntüleme birimlerinde olması ve x ve y eksenlerinin otomatik olarak ayarlanmamasıdır, böylece tek bir değişimin yüksekliği-bir-kutusudur.

Diğer bir deyişle, sağladığınız örnek, yükseklik> genişliğe sahip dikdörtgen bir çizimdir ve yükseklik ve genişlik, bir değişiklikten en fazla == yükseklik-bir kutuyu yapmak için seçilir. İşte

geçerli olan bu tekniklerin bir örnek:

import matplotlib.pyplot as plt 

BOX = 5 
START = 365 
changes = (8, -3, 4, -4, 12, -3, 7, -3, 5, -9, 3) 

# one way to force dimensions is to set the figure size: 
fig = plt.figure(figsize=(5, 10)) 

# another way is to control the axes dimensions 
# for axes to have specific dimensions: 
#     [ x0, y0, w, h] in figure units, from 0 to 1 
#ax = fig.add_axes([.15, .15, .7*.5, .7]) 
ax = fig.add_axes([.15, .15, .7, .7]) 

def sign(val): 
    return val/abs(val) 

pointChanges = [] 
for chg in changes: 
    pointChanges += [sign(chg)] * abs(chg) 

symbol = {-1:'o', 
      1:'x'} 

chgStart = START 
for ichg, chg in enumerate(changes): 
    x = [ichg+1] * abs(chg) 
    y = [chgStart + i * BOX * sign(chg) for i in range(abs(chg))] 
    chgStart += BOX * sign(chg) * (abs(chg)-2) 
    ax.scatter(x, y, 
       marker=symbol[sign(chg)], 
       s=175) #<----- control size of scatter symbol 

ax.set_xlim(0, len(changes)+1) 
fig.savefig('pointandfigure.png') 
plt.show() 
her dağılım grafiği için geliştirilen yöntem çok hackish olmakla kilit noktası ben dağılım s parametre ve şekil boyutuna oynamak için gerekli olmasıdır

İstediğiniz etkiden bir şey elde edin.

çıkan komplo:

enter image description here

İdeal olarak, bir dağılım yönteminin örnek alınarak özel bir yöntem olur. X'in, o ve ay etiketlerini içeren özel bir Collectioninstance oluşturur. Ayrıca a) eksenleri/şekil yönünü otomatik olarak ayarlar veya b) asimetrik semboller yapar. Bu açıkça Matplotlib projesine bir geliştirici olarak katkıda bulunmak isteyen biri için tasarlanmış gelişmiş bir seçenektir.

+0

Detaylı cevap için çok teşekkür ederim. – Jeff

+0

+1 İyi yanıt, daha önce degerlendirildi – joaquin

0

Kişisel deneyim yok, ancak here'dan set_view_interval() veya set_data_interval()? Bir proje için Matplotlib'i kullandım, ancak x ekseni genişliğini sabitlemek için oynamamıştım.

+0

Bir veri çerçevesindeki X ve O'nuz varsa, aynı grafiği nasıl oluşturursunuz? –

İlgili konular