2016-09-28 56 views
1

可以說我有以下數據說matplotlib - 基於附加數據的情節多個標記

x=[0,1,2,3,4,5,6,7,8,9] 
y=[1.0,1.5,2.3,2.2,1.1,1.4,2.0,2.8,1.9,2.0] 
z=['A','A','A','B','B','A','B','B','B','B'] 
plt.plot(x,y, marker='S') 

會給我有方形標記物的X-Y的情節。有沒有辦法根據數據z更改標記類型,以便所有'A'類型都有方形標記,'B'類型有三角形標記。

但我要添加在曲線上的「Z」的數據,只有當它(從「A」向「B」,或反之亦然在這種情況下)改變從一種類型到另

回答

1
import matplotlib.pyplot as plt 

fig = plt.figure(0) 
x=[0,1,2,3,4,5,6,7,8,9] 
y=[1.0,1.5,2.3,2.2,1.1,1.4,2.0,2.8,1.9,2.0] 
z=['A','A','A','B','B','A','B','B','B','B'] 
plt.plot(x,y) 

if 'A' in z and 'B' in z: 
    xs = [a for a,b in zip(x, z) if b == 'A'] 
    ys = [a for a,b in zip(y, z) if b == 'A'] 
    plt.scatter(xs, ys, marker='s') 

    xt = [a for a,b in zip(x, z) if b == 'B'] 
    yt = [a for a,b in zip(y, z) if b == 'B'] 
    plt.scatter(xt, yt, marker='^') 
else: 
    plt.scatter(x, y, marker='.', s=0) 


plt.show() 

或者

import matplotlib.pyplot as plt 

fig = plt.figure(0) 
x=[0,1,2,3,4,5,6,7,8,9] 
y=[1.0,1.5,2.3,2.2,1.1,1.4,2.0,2.8,1.9,2.0] 
z=['A','A','A','B','B','A','B','B','B','B'] 
plt.plot(x,y) 

if 'A' in z and 'B' in z: 
    plt.scatter(x, y, marker='s', s=list(map(lambda a: 20 if a == 'A' else 0, z))) 
    plt.scatter(x, y, marker='^', s=list(map(lambda a: 20 if a == 'B' else 0, z))) 
else: 
    plt.scatter(x, y, marker='.', s=0) 


plt.show() 
+0

不幸的是,我的數據點很大(10K),所以散點似乎重疊,並使情節混亂。這是否適用於簡單的線條圖? – WanderingMind

+0

@WanderingMind你是什麼意思*簡單的線條圖*? – Leon

+0

是的,但我通過更改圖形大小和標記大小來解決散點圖中的問題。我現在可以接受你的答案。 – WanderingMind