1

我正在尝试绘制一些数据,我想在这些数据上制作插图以显示一些细节。创建插图并在插图内设置情节的特征非常容易。

我发现麻烦的是如何设置插图本身的属性,特别是插图框架的颜色和厚度,指示绘图采样位置的小框以及将小框连接到插图的线条。我需要的是单独改变它们。我知道可以将 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)

结果如下:

在此处输入图像描述

4

1 回答 1

3

更改单个对象的属性通常不是什么大问题。

  • 嵌入框架应该更薄更虚线,

    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(":") 
    

结果:
在此处输入图像描述

于 2017-06-23T08:44:17.357 回答