【问题标题】:Adding a second Y-Axis to an inset zoom axes向插图缩放轴添加第二个 Y 轴
【发布时间】:2013-01-19 05:27:18
【问题描述】:

我绘制了一个将两个 y 轴(即两个不同的 S.I. 比例)与单个 x 轴相关联的图形。我必须放大一些值,并使用 Matplotlib 中的 zoom_inset_locator 技巧来管理它。我实现了缩放轴,但我缺少第二个 y 轴(参见下面的示例):

它确实尝试再次使用 twinx() 添加第二个轴,但它失败了,因为它在主 twinx(右)轴上绘制轴,但在缩放右轴上留下空白刻度,似乎给出了 x 轴正确的处理方式,见下文:

有什么解决方法吗?这是我用来绘制图形的代码:

import numpy,os,sys
import pylab
import scipy.optimize
from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes
from mpl_toolkits.axes_grid1.inset_locator import mark_inset

# Initializing the curve
fig_cal=pylab.figure()
host_weight = fig_cal.add_subplot(111)
host_mass = host_weight.twinx()
Tension = numpy.linspace(0,0.08,100)
Weight = 0.5* Tension
Mass = Weight/9.81

# Plotting the curve

host_weight.plot(Tension, Weight, 'r', label='Fitted line',lw=2)
host_mass.plot(Tension, Mass)

# Cosmetic on the Figure
host_weight.set_xlabel("Tension U [$V$]")
host_weight.set_ylabel("Weight F [$N$]")
host_mass.set_ylabel("Mass M [$kg$]")
host_mass.set_ylim(host_weight.axis()[-2]/9.81, host_weight.axis()[-1]/9.81)
host_weight.grid(False)

# Zoom on the first measurement
zoom_weight = zoomed_inset_axes(host_weight, zoom = 7.5, bbox_to_anchor=(0.95,0.5), bbox_transform=host_weight.transAxes)
zoom_weight.plot(Tension[:4], Weight[:4], 'r', lw=2)
zoom_weight.set_xticks(zoom_weight.xaxis.get_majorticklocs()[::2])
zoom_weight.set_yticks(zoom_weight.yaxis.get_majorticklocs()[::2])
# zoom_mass = zoom_weight.twinx()

# zoom_mass.plot(Tension[:4], Mass[:4],alpha=0)
# zoom_mass.set_ylim(zoom_weight.axis()[-2]/9.81,zoom_weight.axis()[-1]/9.81)
mark_inset(host_weight, zoom_weight, loc1=2, loc2=4, fc="none", ec="0.5")

pylab.show()

【问题讨论】:

  • 这只是最奇怪的。 似乎是 axes_grid1 工具包中的一个错误。
  • +1 向我展示了这个不错的 zoomed_inset_axes 功能。
  • 我看到你自己在github上提出了一个问题

标签: python matplotlib


【解决方案1】:

您可以考虑使用股票代码格式化程序:

代码是这样的:

formatter = matplotlib.ticker.EngFormatter(unit='S', places=3)
formatter.ENG_PREFIXES[-6] = 'u'
plt.axes().yaxis.set_major_formatter(formatter)

请看这篇文章,了解情节的样子: matplotlib; fractional powers of ten; scientific notation

【讨论】:

    【解决方案2】:

    所以我找到了我的问题的答案...抱歉耽搁了,但我暂时搁置了这个问题...我确实找到了错误,但只是通过使用 alpha 通道生成另一个缩放插图的解决方法禁用很多东西...

    这是我的代码:

    import numpy,os,sys
    import pylab
    from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes
    from mpl_toolkits.axes_grid1.inset_locator import mark_inset
    
    # Initializing the curve
    fig_cal=pylab.figure()
    host_weight = fig_cal.add_subplot(111)
    host_mass = host_weight.twinx()
    Tension = numpy.linspace(0,0.08,100)
    Weight = 0.5* Tension
    Mass = Weight/9.81
    
    # Plotting the curve
    host_weight.plot(Tension, Weight, 'r', label='Fitted line',lw=2)
    host_mass.plot(Tension, Mass, alpha=0)
    
    # Cosmetic on the Figure
    host_weight.set_xlabel("Tension U [$V$]")
    host_weight.set_ylabel("Weight F [$N$]")
    host_mass.set_ylabel("Mass M [$kg$]")
    host_mass.set_ylim(host_weight.axis()[-2]/9.81, host_weight.axis()[-1]/9.81)
    host_weight.grid(False)
    
    # Zoom on the first measurement
    zoom_weight = zoomed_inset_axes(host_weight, zoom = 7.5, bbox_to_anchor=(0.95,0.5), bbox_transform=host_weight.transAxes)
    zoom_weight.plot(Tension[:4], Weight[:4], 'r', lw=2)
    zoom_weight.set_xticks(zoom_weight.xaxis.get_majorticklocs()[::2])
    zoom_weight.set_yticks(zoom_weight.yaxis.get_majorticklocs()[::2])
    zoom_mass = zoomed_inset_axes(host_mass, zoom = 7.5, bbox_to_anchor=(0.95,0.5),     bbox_transform=host_mass.transAxes)
    zoom_mass.xaxis.set_visible(False)
    zoom_mass.spines['left'].set_visible(False)
    zoom_mass.spines['top'].set_visible(False)
    zoom_mass.patch.set_alpha(00)
    zoom_mass.yaxis.tick_right()
    zoom_mass.yaxis.set_label_position('right')
    zoom_mass.yaxis.set_offset_position('right')
    zoom_mass.plot(Tension[:4], Mass[:4],color='w', alpha=0)
    zoom_mass.set_ylim(zoom_weight.axis()[-2]/9.81,zoom_weight.axis()[-1]/9.81)
    
    pylab.show()
    

    也许不是最好的方法,但它有效!!!

    【讨论】: