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)
而且这里的结果是:
设定值存取时,我得到一个异常:类型错误:''' 'odict_values' 对象不支持indexing''' 。 – Alex
完美,非常有帮助! 只有两个好奇心: 为什么你在'''inset_twinx'''上设置属性而不是插入?他们必须被迫在最后一个覆盖层? 你认为可以使用一个句柄而不是静态函数'''plt.setp()'''(例如'''ax.setp()''')或类似的东西来改变插入框架吗?) – Alex
我使用'plt.setp'和每个属性的句柄添加了不同的选项。我会说,使用哪一个只是一个口味问题。关于'inset_twinx':由于您将框架设置为'inset' off(',frameon = False'),因此显示的框架是来自双轴的框架。因此,我们需要改变那个,而不是无形的其他。 – ImportanceOfBeingErnest