2016-12-12 23 views
2

我想繪製一個或多個信號轉換成一個陰謀。大多數Python的方式來繪製多個信號

對於每個信號,各個顏色,線寬和線型可以被指定。 如果多個信號必須被繪製,圖例也應該被提供。

到目前爲止,我使用下面的代碼,讓我繪製多達三個信號。

import matplotlib 
fig = matplotlib.figure.Figure(figsize=(8,6)) 
subplot = fig.add_axes([0.1, 0.2, 0.8, 0.75]) 
Signal2, Signal3, legend, t = None, None, None, None 
Signal1, = subplot.plot(xDataSignal1, yDataSignal1, color=LineColor[0], linewidth=LineWidth[0],linestyle=LineStyle[0]) 
if (yDataSignal2 != [] and yDataSignal3 != []): 
    Signal2, = subplot.plot(xDataSignal2, yDataSignal2, color=LineColor[1], linewidth=LineWidth[1],linestyle=LineStyle[1]) 
    Signal3, = subplot.plot(xDataSignal3, yDataSignal3, color=LineColor[2], linewidth=LineWidth[2],linestyle=LineStyle[2]) 
    legend = subplot.legend([Signal1, Signal2, Signal3], [yLabel[0], yLabel[1], yLabel[2]],LegendPosition,labelspacing=0.1, borderpad=0.1) 
    legend.get_frame().set_linewidth(0.5) 
    for t in legend.get_texts(): 
     t.set_fontsize(10) 
elif (yDataSignal2 != []): 
    Signal2, = subplot.plot(xDataSignal2, yDataSignal2, color=LineColor[1], linewidth=LineWidth[1],linestyle=LineStyle[1]) 
    legend = subplot.legend([Signal1, Signal2], [yLabel[0], yLabel[1]], LegendPosition,labelspacing=0.1, borderpad=0.1) 
    legend.get_frame().set_linewidth(0.5) 
    for t in legend.get_texts(): 
     t.set_fontsize(10) 

是否可以概括的代碼,使得它更Python和還利用matplotlib和插曲的最多n個信號支持?

任何建議,非常感謝。

+1

你如何創建某種類型的字典列表,其中列表中的每個元素都是一個字典,它將包含你的x和y數據,linecolor,linewidth等等。然後你可以創建一個plot,iterate在所述字典列表上,並繪製所有相同的軸? –

+0

好評。我會試試這個。謝謝。 – Rickson

回答

6

類型的字典列表可能是一個很好的解決方案(你甚至可以用一個defaultdict默認的情況下,顏色和線寬你不想指定它,閱讀更多here

import matplotlib as mpl 
import matplotlib.pyplot as plt 
import numpy as np 

mysignals = [{'name': 'Signal1', 'x': np.arange(10,20,1), 
      'y': np.random.rand(10), 'color':'r', 'linewidth':1}, 
      {'name': 'Signal2', 'x': np.arange(10,20,1), 
      'y': np.random.rand(10), 'color':'b', 'linewidth':3}, 
      {'name': 'Signal3', 'x': np.arange(10,20,1), 
      'y': np.random.rand(10), 'color':'k', 'linewidth':2}] 

fig, ax = plt.subplots() 
for signal in mysignals: 
    ax.plot(signal['x'], signal['y'], 
      color=signal['color'], 
      linewidth=signal['linewidth'], 
      label=signal['name']) 

# Enable legend 
ax.legend() 
ax.set_title("My graph") 
plt.show() 

enter image description here

+1

太棒了!非常感謝。 – Rickson