2017-06-23 86 views
1

我想繪製一些數據,我想在其中插入一些數據以顯示一些細節。 創建插圖並在插圖內設置繪圖的特徵非常簡單。Matplotlib單獨更改插入元素的樣式

我發現很麻煩的是如何設置插入本身的屬性,特別是插入框架的顏色和厚度,指示繪圖在何處被採樣的小框以及用於將小框連接到插圖。 我需要的是單獨改變它們。我知道可以將mark_inset的屬性更改爲單個部分,但不能將其作爲分隔部分。比如說,例如,內嵌框架應該更細且虛線,採樣框變粗,紅色,連接線點綴,並且與MWE中的顏色相同。

這裏是MWE:

import scipy as sc 
import matplotlib.pyplot as plt 
from cycler import cycler 
from mpl_toolkits.axes_grid1.inset_locator import inset_axes 
from mpl_toolkits.axes_grid1.inset_locator import mark_inset 
plt.close('all') 

color = plt.get_cmap('viridis')(sc.linspace(0, 1, 4)[1:3]) 
params_IEEEtran = {'legend.fontsize': 10, 
        'axes.labelsize': 10, 
        'axes.titlesize': 10, 
        'xtick.labelsize': 9, 
        'ytick.labelsize': 9, 
        'mathtext.fontset': 'stix', 
        'font.family': 'Times New Roman', 
        'mathtext.rm': 'serif', 
        'mathtext.bf': 'serif:bold', 
        'mathtext.it': 'serif:italic', 
        'mathtext.sf': 'sans\\-serif', 
        'grid.color': 'k', 
        'grid.linestyle': ':', 
        'grid.linewidth': 0.5, 
        'axes.xmargin': 0, 
        'axes.axisbelow': False, 
        'lines.linewidth': 1.0, 
        'legend.frameon': False, 
        'axes.prop_cycle': cycler('color', plt.get_cmap('viridis')(
          sc.linspace(0, 1, 4))), 
        'figure.figsize': [3, 2.4], 
        } 
plt.rcParams.update(params_IEEEtran) 

x = sc.linspace(0.1, 100) 
y1 = sc.array(sc.sqrt(x)).T 
y2 = sc.array(1/sc.sqrt(x)).T 

fig = plt.figure('FIG') 
ax = fig.add_subplot(1, 1, 1) 
ax.plot(x, y1) 

ax_twinx = ax.twinx() 
ax_twinx.plot(x, y2) 

ax.set_xlim(0, 100) 
ax.set_ylim(0, 10) 
ax_twinx.set_ylim(0, 1) 

inset = fig.add_axes([0.6, 0.3, 0.12, 0.35], frameon=False) 
inset.axes.get_xaxis().set_visible(False) 
inset.axes.get_yaxis().set_visible(False) 

inset.plot(x, y1) 

inset_twinx = inset.twinx() 
inset_twinx.axes.get_yaxis().set_visible(False) 

inset_twinx.plot(x, y2) 

inset.set_xlim(5, 15) 
inset.set_ylim(2, 4) 
inset_twinx.set_ylim(0.2, 0.4) 

mark_inset(ax, inset, loc1=4, loc2=2, lw=0.3, 
      fc="none", ec=color[0], zorder=200) 
fig.savefig('./example.png', bbox_inches='tight', dpi=300) 

而且這裏的結果是:

enter image description here

回答

2

更改單個對象的屬性,通常不是一個大問題。

  • 插圖幀應該是薄且虛線,

    plt.setp(inset_twinx.spines.values(), linewidth=0.5, linestyle="--") #python 2 
    

    plt.setp(list(inset_twinx.spines.values()), linewidth=0.5, linestyle="--") #python3 
    

    for d in ["left", "right", "top", "bottom"]: 
        inset_twinx.spines[d].set_linewidth(0.5) 
        inset_twinx.spines[d].set_linestyle("--") 
    

要改變插圖連接器和箱,我們需要一個手柄這些對象首先,

box, c1, c2 = mark_inset(ax, inset, loc1=4, loc2=2, lw=0.3, 
      fc="none", ec=color[0], zorder=200) 
  • 採樣盒較厚和紅色

    plt.setp(box, linewidth=3, color="red") 
    

    box.set_linewidth(3) 
    box.set_color("red") 
    
  • 的連接線點綴並且與MWE中的顏色相同。

    plt.setp([c1,c2], linestyle=":") 
    

    for c in [c1,c2]: 
        c.set_linestyle(":") 
    

結果:
enter image description here

+0

設定值存取時,我得到一個異常:類型錯誤:''' 'odict_values' 對象不支持indexing''' 。 – Alex

+0

完美,非常有幫助! 只有兩個好奇心: 爲什麼你在'''inset_twinx'''上設置屬性而不是插入?他們必須被迫在最後一個覆蓋層? 你認爲可以使用一個句柄而不是靜態函數'''plt.setp()'''(例如'''ax.setp()''')或類似的東西來改變插入框架嗎?) – Alex

+0

我使用'plt.setp'和每個屬性的句柄添加了不同的選項。我會說,使用哪一個只是一個口味問題。關於'inset_twinx':由於您將框架設置爲'inset' off(',frameon = False'),因此顯示的框架是來自雙軸的框架。因此,我們需要改變那個,而不是無形的其他。 – ImportanceOfBeingErnest