2015-05-18 28 views
5

İşaretleyicinin farklı türleri gösterdiği her bir nokta için metre cinsinden hıza sahip bir dağılım grafiği yapmaya çalışıyorum, boyut farklı ağırlıkları gösterir ve renk bir noktanın 10'un üzerinde olduğunu gösterir. dakika ölçeği Bununla birlikte, sadece şu ana kadar boyuta göre çizim yapabiliyordum.Farklı boyut, işaretleyici ve pandalardan gelen renk verileriyle dağılım Scatterplot

Herhangi bir yardım çok takdir edilmektedir.

x = {'speed': [10, 15, 20, 18, 19], 'meters' : [122, 150, 190, 230, 300], 'type': ['phone', 'phone', 'gps', 'gps', 'car'], 'weight': [0.2, 0.3, 0.1, 0.85, 0.0], 'old': [1, 2, 4, 5, 8]} 

m = pd.DataFrame(x) 

plt.scatter(m.meters, m.speed, s = 30* m.weight) 

mkr_dict = {'gps': 'x', 'phone': '+', 'car': 'o'} 

    meters speed type weight old 
0  122  10 phone 0.20 1 
1  150  15 phone 0.30 2 
2  190  20 gps 0.10 4 
3  230  18 gps 0.85 5 
4  300  19 car 0.00 8 

Güncelleme soru:

eski dayalı renk ölçeğine Colorbar eklemek çalışıyorum. tüm veri kümesine karşı çizim yaptığımda çalıştı, ancak her alt küme için işaretleyici eklemeye çalıştıktan sonra başarısız oldu. Herhangi bir fikir?

plt.scatter(m.meters, m.speed, s = 30* m.weight, c=m.old) 
cbar = plt.colorbar(ticks = [0, 5, 10]) 
cbar.ax.set_yticklabels(['New','5mins', '10mins']) 

TypeError: sadece birkaç noktanız varsa Önce, Haritalanabilir

cevap

9

scatter Bir seferde yalnızca bir tür işaretleyici yapabilir, böylece farklı türleri ayrı ayrı çizmek zorundasınız. Neyse pandalar bu kolaylaştırır:

import matplotlib.pyplot as plt 
import pandas as pd 
x = {'speed': [10, 15, 20, 18, 19], 
    'meters' : [122, 150, 190, 230, 300], 
    'type': ['phone', 'phone', 'gps', 'gps', 'car'], 
    'weight': [0.2, 0.3, 0.1, 0.85, 0.0], 
    'old': [1, 2, 4, 5, 8]} 

m = pd.DataFrame(x) 
mkr_dict = {'gps': 'x', 'phone': '+', 'car': 'o'} 
for kind in mkr_dict: 
    d = m[m.type==kind] 
    plt.scatter(d.meters, d.speed, 
       s = 100* d.weight, 
       c = d.old, 
       marker = mkr_dict[kind]) 
plt.show() 

enter image description here

.... araba nerede? Eh, orijinal test verilerinde ağırlık 0.0'dır ve markör boyutu için ağırlık kullanıyoruz, yani: göremiyorum.

5

için set_array gerekir burada, sen c argüman için şamandıraların listesini geçirebilirsiniz:

colors = ['r', 'b', 'k', 'g', 'm'] 
plt.scatter(m.meters, m.speed, s=30*m.weight, vmin=0, vmax=10, cmap=cm) 

için Verilen sırayla puanlarınızı renkli hale getirin. ya kendi Patch es ekleyebilir veya her seferinde bir nokta eklemek gerekir,

cm = plt.cm.get_cmap('hot') # or your colormap of choice 
plt.scatter(m.meters, m.speed, s=30*m.weight, c=m.old, cmap=cm) 

işaretleyici şekillerini değiştirmek için: Alternatif olarak, bir renk haritası kullanmak mesela

enter image description here

markers = ['^', 'o', 'v', 's', 'd'] 
for px, py, c, s, t in zip(m.meters, m.speed, m.old, m.weight, markers): 
    plt.scatter(px, py, marker=t, c=cm(c/10.), vmin=0, vmax=10, s=400*s+100) 
plt.show() 
(başka türlü boyutu 0.0 olurdu 5. noktası görmek için farklı bir aralığa m.weight artırdığınızı).