2015-12-31 47 views
2

我想繪製一個圖例,指定標記的值和線的值,但不是兩者的組合。圖例中的分割標記和線 - Matplotlib

這個例子應該有助於說明我的目標:

import matplotlib.pyplot as plt 
import numpy as np 

pi=3.14 
xx=np.linspace(0,2*pi,100) 


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

phases=[0,pi/4,pi/2] 
markers=['s','o','^'] 

for phase,mk in zip(phases,markers): 
    labeltext='Sine' + '*' + str(phase) 
    F=[np.sin(x+phase) for x in xx] 
    ax.plot(xx,F,color='b',marker=mk,label=labeltext) 

    labeltext='Cosine' + '*' + str(phase) 
    F=[np.cos(x+phase) for x in xx] 
    ax.plot(xx,F,color='g',marker=mk,label=labeltext) 

hand, labl = ax.get_legend_handles_labels() 
#hand, labl = function_to_split(hand,labl,'*') 
ax.legend(hand,labl) 
plt.savefig('Figure.png') 

所得結果爲以下 MWE figure

我想什麼是function_to_split與這樣一個傳奇人物會自動結束:

[blue line] Sine 
[green line] Cosine 
[black square] 0 
[black circle] 0.785 
[black triangle] 1.57 

回答

0

我想通過自動創建虛構的手柄。

import matplotlib.pyplot as plt 
import numpy as np 

def function_to_split(hand,labl,dividor): 

    Hand_L=[] 
    Hand_M=[] 
    Labl_L=[] 
    Labl_M=[] 

    for h,l in zip(hand,labl): 
     co=h.get_color() 
     ls=h.get_linestyle() 
     lw=h.get_linewidth() 
     mk=h.get_marker() 
     mew=h.get_markeredgewidth() 
     ms=h.get_markersize() 

     LABS=l.split(dividor) 

     if len(LABS) != 2: 
      print 'Split Legends Error: Only exactly 1 Dividor is accepted.' 
      print '      Currently ' + str(len(LABS)-1) + ' dividors were given' 
      return hand,labl 

     #Line and Color 
     LICO = plt.Line2D((0,1),(0,0), color=co, marker='', linestyle=ls,linewidth=lw) 
     #Marker 
     MARK = plt.Line2D((0,1),(0,0), color='k', marker=mk, markeredgewidth=mew, markersize=ms, linestyle='') 

     if LABS[0] not in Labl_L: 
      Hand_L.append(LICO) 
      Labl_L.append(LABS[0]) 

     if LABS[1] not in Labl_M: 
      Hand_M.append(MARK) 
      Labl_M.append(LABS[1]) 

    return Hand_L+Hand_M,Labl_L+Labl_M 



pi=3.14 
xx=np.linspace(0,2*pi,100) 


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

phases=[0,pi/4,pi/2] 
markers=['s','o','^'] 

for phase,mk in zip(phases,markers): 
    labeltext='Sine' + '*' + str(phase) 
    F=[np.sin(x+phase) for x in xx] 
    ax.plot(xx,F,color='b',marker=mk,label=labeltext) 

    labeltext='Cosine' + '*' + str(phase) 
    F=[np.cos(x+phase) for x in xx] 
    ax.plot(xx,F,color='g',marker=mk,label=labeltext) 

hand, labl = ax.get_legend_handles_labels() 
hand, labl = function_to_split(hand,labl,'*') 
ax.legend(hand,labl) 
plt.savefig('Figure.png') 

enter image description here

相關問題