[英]Bar plot in inset plot (matplotlib) has problems when adding text as labels?
[英]Using twiny() in an inset plot in Matplotlib
我试图将第二个x轴添加到我从mpl_toolkits.axes_grid1.inset_locator
用InsetPosition
创建的插图中(例如https://scipython.com/blog/inset-plots-in-matplotlib/ ),但是第二个x轴似乎没有显示,我也不知道为什么。
这是我正在使用的代码:
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca()
from mpl_toolkits.axes_grid1.inset_locator import InsetPosition
zoom_ax = fig.add_axes([0,0,1,1])
zoom_ax.set_axes_locator(InsetPosition(ax, [0.6, 0.6, 0.3, 0.3]))
def expansion(z):
return 1.0 / (1.0 + z)
def redshift(a):
return 1.0 / a - 1.0
def tick_function(a):
return ["%.1f" % z for z in redshift(a)]
z_ticks = np.array([0.0, 0.5, 1.0, 2.0, 5.0, 100.0])
a_ticks = expansion(z_ticks)
twin_ax = zoom_ax.twiny()
twin_ax.set_xticks(a_ticks)
twin_ax.set_xticklabels(tick_function(a_ticks))
twin_ax.set_xlim(zoom_ax.get_xlim())
xmin, xmax = 0.0, 1.0
x = np.linspace(xmin, xmax)
zoom_ax.plot(x, np.sin(x))
zoom_ax.set_xlim(xmin, xmax)
plt.show()
这将产生以下绘图-没有任何twiny()
轴:
显然axes_locator
twiny()
对于axes_locator
使用的zoom_ax
有问题(不知道这是否是错误)。 如果重复set_axes_locator()
命令twin_ax
,得到的情节看起来像我期望(我离开了轴蜱命令,使我的例子情节更容易理解):
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca()
from mpl_toolkits.axes_grid1.inset_locator import InsetPosition
zoom_ax = fig.add_axes([0,0,1,1])
zoom_ax.set_axes_locator(InsetPosition(ax, [0.6, 0.6, 0.3, 0.3]))
def expansion(z):
return 1.0 / (1.0 + z)
def redshift(a):
return 1.0 / a - 1.0
def tick_function(a):
return ["%.1f" % z for z in redshift(a)]
z_ticks = np.array([0.0, 0.5, 1.0, 2.0, 5.0, 100.0])
a_ticks = expansion(z_ticks)
twin_ax = zoom_ax.twiny()
##twin_ax.set_xticks(a_ticks)
##twin_ax.set_xticklabels(tick_function(a_ticks))
twin_ax.set_xlim(zoom_ax.get_xlim())
xmin, xmax = 0.0, 1.0
x = np.linspace(xmin, xmax)
zoom_ax.plot(x, np.sin(x))
zoom_ax.set_xlim(xmin, xmax)
##the extra lines
twin_ax.set_axes_locator(InsetPosition(ax, [0.6, 0.6, 0.3, 0.3]))
x2 = np.linspace(xmin, 2*xmax)
twin_ax.plot(x2,np.cos(x2),'r')
twin_ax.set_xlim(xmin, 2*xmax)
plt.show()
这将产生以下图:
也许您想使用通常的mpl_toolkits.axes_grid1.inset_locator.inset_axes
,即使使用孪生也可以正常工作。
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca()
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
zoom_ax = inset_axes(ax, "100%", "100%", bbox_to_anchor=[0.6, 0.6, 0.3, 0.3],
bbox_transform=ax.transAxes)
def expansion(z):
return 1.0 / (1.0 + z)
def redshift(a):
return 1.0 / a - 1.0
def tick_function(a):
return ["%.1f" % z for z in redshift(a)]
z_ticks = np.array([0.0, 0.5, 1.0, 2.0, 5.0, 100.0])
a_ticks = expansion(z_ticks)
twin_ax = zoom_ax.twiny()
twin_ax.set_xticks(a_ticks)
twin_ax.set_xticklabels(tick_function(a_ticks))
twin_ax.set_xlim(zoom_ax.get_xlim())
xmin, xmax = 0.0, 1.0
x = np.linspace(xmin, xmax)
zoom_ax.plot(x, np.sin(x))
zoom_ax.set_xlim(xmin, xmax)
plt.show()
从matplotlib 3.0开始,您可以使用Axes.inset_axes
进一步简化此Axes.inset_axes
:
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca()
zoom_ax = ax.inset_axes([0.6, 0.6, 0.3, 0.3])
def expansion(z):
return 1.0 / (1.0 + z)
def redshift(a):
return 1.0 / a - 1.0
def tick_function(a):
return ["%.1f" % z for z in redshift(a)]
z_ticks = np.array([0.0, 0.5, 1.0, 2.0, 5.0, 100.0])
a_ticks = expansion(z_ticks)
twin_ax = zoom_ax.twiny()
twin_ax.set_xticks(a_ticks)
twin_ax.set_xticklabels(tick_function(a_ticks))
twin_ax.set_xlim(zoom_ax.get_xlim())
xmin, xmax = 0.0, 1.0
x = np.linspace(xmin, xmax)
zoom_ax.plot(x, np.sin(x))
zoom_ax.set_xlim(xmin, xmax)
plt.show()
结果在视觉上是相同的:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.