如何在不覆盖现有数据的情况下使用 add_axes 绘制多个数据
How to plot multiple data usind add_axes without over writing existing
我尝试创建一个带有缩放插图的图形,其中整个图形(所有子图和插图)的数据绘制在代码的不同位置。
为了模仿代码中不同位置的绘图,最小(不工作)示例循环遍历绘图例程。
子图有效,但它们的插图每次都被覆盖。插入轴是使用 add_axes.
创建的
我试过,不是每次都创建子轴 (add_axes),而是只创建它们,如果还没有出现的话:
try:
subax1
except NameError:
subax1 = fig666.add_axes([0.5,0.71,0.35,0.16])
这也没有帮助!
我该如何解决这个问题/我的概念误解是什么?
感谢您的帮助!!!
import matplotlib.pyplot as plt
import numpy
x_data=numpy.array([0, 1, 1.85, 1.9, 1.95, 2, 2.1, 2.5, 5, 10, 25])
y_data=numpy.array([0, 2.5, 1.8, 0.5, 0.2, 11, 1.2, 0.5, 0.15, 10, 25])
y_data_err=y_data*0.1
number_of_runs=3
for iterator in range(number_of_runs):
fig666=plt.figure(666,figsize=(22.0/2.54,18.0/2.54))
#############################
# subplot
ax = plt.subplot(3,1,1)
#ax.plot(x_data,y_data+iterator*0.4,marker=None)
ax.errorbar(x_data,y_data+iterator*0.4,yerr=y_data_err)
#plt.semilogy()
plt.xlim(1.87,2.25)
plt.ylim(0,3.7)
#####################
# zoomed inset to subplot ##
subax1 = fig666.add_axes([0.5,0.71,0.35,0.16])
#subax1.plot(x_data,y_data+iterator*0.2+0.1,marker=None)
subax1.errorbar(x_data,y_data+iterator*0.4,yerr=y_data_err)
plt.xlim(1.87,2.25)
plt.ylim(0,3.7)
这是你想要的吗?
import matplotlib.pyplot as plt
import numpy
x_data=numpy.array([0, 1, 1.85, 1.9, 1.95, 2, 2.1, 2.5, 5, 10, 25])
y_data=numpy.array([0, 2.5, 1.8, 0.5, 0.2, 11, 1.2, 0.5, 0.15, 10, 25])
y_data_err=y_data*0.1
number_of_runs=3
index_lim=2
for iterator in range(number_of_runs):
fig666=plt.figure(666,figsize=(22.0/2.54,18.0/2.54))
#############################
# subplot
ax = plt.subplot(3,1,iterator+1)
ax.plot(x_data,y_data+iterator*0.2,marker=None)
ax.errorbar(x_data,y_data+iterator*0.2,yerr=y_data_err)
plt.semilogy()
#####################
# zoomed inset to subplot ##
[x0,y0], [x1, y1] = fig666.transFigure.inverted().transform(
ax.transAxes.transform([[0.5, 0.2], [0.95, 0.9]]))
subax1 = fig666.add_axes([x0, y0, x1-x0, y1-y0])
#subax1.plot(x_data,y_data+iterator*0.2+0.1,marker=None)
subax1.errorbar(x_data,y_data+iterator*0.2,yerr=y_data_err)
subax1.set_xlim(1.87,2.25)
subax1.set_ylim(0,3.7)
输出:
要创建三个大坐标轴,需要更改subplot()
的第三个参数:
ax = plt.subplot(3,1,iterator+1)
为了在轴上创建缩放,我使用 transFigure
和 transAxes
将轴上的点转换为图中的点。
[x0,y0], [x1, y1] = fig666.transFigure.inverted().transform(
ax.transAxes.transform([[0.5, 0.2], [0.95, 0.9]]))
问题似乎是由子图命令引起的:由于插图plot/axes完全在子图中,插图axes/plot在再次调用子图时被删除。使用 add_axes 而不是 subplot(3,1,1) 创建周围的轴修复了这个问题:
import matplotlib.pyplot as plt
import numpy
x_data=numpy.array([0, 1, 1.85, 1.9, 1.95, 2, 2.1, 2.5, 5, 10, 25])
y_data=numpy.array([0, 2.5, 1.8, 0.5, 0.2, 11, 1.2, 0.5, 0.15, 10, 25])
y_data_err=y_data*0.1
number_of_runs=3
index_lim=2
for iterator in range(number_of_runs):
fig666=plt.figure(666,figsize=(22.0/2.54,18.0/2.54))
#############################
# subplot
#ax = plt.subplot(3,1,3)
ax=fig666.add_axes([0.125,0.666,0.775,0.235])
ax.plot(x_data,y_data+iterator*0.2,marker=None)
ax.errorbar(x_data,y_data+iterator*0.2,yerr=y_data_err)
plt.semilogy()
#####################
# zoomed inset to subplot ##
subax1 = fig666.add_axes([0.5,0.71,0.35,0.16])
#subax1.plot(x_data,y_data+iterator*0.2+0.1,marker=None)
subax1.errorbar(x_data,y_data+iterator*0.5,yerr=y_data_err)
plt.xlim(1.87,2.25)
plt.ylim(0,3.7)
plt.show()
ax = plt.subplot(3,1,2)
我尝试创建一个带有缩放插图的图形,其中整个图形(所有子图和插图)的数据绘制在代码的不同位置。
为了模仿代码中不同位置的绘图,最小(不工作)示例循环遍历绘图例程。
子图有效,但它们的插图每次都被覆盖。插入轴是使用 add_axes.
创建的我试过,不是每次都创建子轴 (add_axes),而是只创建它们,如果还没有出现的话:
try:
subax1
except NameError:
subax1 = fig666.add_axes([0.5,0.71,0.35,0.16])
这也没有帮助!
我该如何解决这个问题/我的概念误解是什么?
感谢您的帮助!!!
import matplotlib.pyplot as plt
import numpy
x_data=numpy.array([0, 1, 1.85, 1.9, 1.95, 2, 2.1, 2.5, 5, 10, 25])
y_data=numpy.array([0, 2.5, 1.8, 0.5, 0.2, 11, 1.2, 0.5, 0.15, 10, 25])
y_data_err=y_data*0.1
number_of_runs=3
for iterator in range(number_of_runs):
fig666=plt.figure(666,figsize=(22.0/2.54,18.0/2.54))
#############################
# subplot
ax = plt.subplot(3,1,1)
#ax.plot(x_data,y_data+iterator*0.4,marker=None)
ax.errorbar(x_data,y_data+iterator*0.4,yerr=y_data_err)
#plt.semilogy()
plt.xlim(1.87,2.25)
plt.ylim(0,3.7)
#####################
# zoomed inset to subplot ##
subax1 = fig666.add_axes([0.5,0.71,0.35,0.16])
#subax1.plot(x_data,y_data+iterator*0.2+0.1,marker=None)
subax1.errorbar(x_data,y_data+iterator*0.4,yerr=y_data_err)
plt.xlim(1.87,2.25)
plt.ylim(0,3.7)
这是你想要的吗?
import matplotlib.pyplot as plt
import numpy
x_data=numpy.array([0, 1, 1.85, 1.9, 1.95, 2, 2.1, 2.5, 5, 10, 25])
y_data=numpy.array([0, 2.5, 1.8, 0.5, 0.2, 11, 1.2, 0.5, 0.15, 10, 25])
y_data_err=y_data*0.1
number_of_runs=3
index_lim=2
for iterator in range(number_of_runs):
fig666=plt.figure(666,figsize=(22.0/2.54,18.0/2.54))
#############################
# subplot
ax = plt.subplot(3,1,iterator+1)
ax.plot(x_data,y_data+iterator*0.2,marker=None)
ax.errorbar(x_data,y_data+iterator*0.2,yerr=y_data_err)
plt.semilogy()
#####################
# zoomed inset to subplot ##
[x0,y0], [x1, y1] = fig666.transFigure.inverted().transform(
ax.transAxes.transform([[0.5, 0.2], [0.95, 0.9]]))
subax1 = fig666.add_axes([x0, y0, x1-x0, y1-y0])
#subax1.plot(x_data,y_data+iterator*0.2+0.1,marker=None)
subax1.errorbar(x_data,y_data+iterator*0.2,yerr=y_data_err)
subax1.set_xlim(1.87,2.25)
subax1.set_ylim(0,3.7)
输出:
要创建三个大坐标轴,需要更改subplot()
的第三个参数:
ax = plt.subplot(3,1,iterator+1)
为了在轴上创建缩放,我使用 transFigure
和 transAxes
将轴上的点转换为图中的点。
[x0,y0], [x1, y1] = fig666.transFigure.inverted().transform(
ax.transAxes.transform([[0.5, 0.2], [0.95, 0.9]]))
问题似乎是由子图命令引起的:由于插图plot/axes完全在子图中,插图axes/plot在再次调用子图时被删除。使用 add_axes 而不是 subplot(3,1,1) 创建周围的轴修复了这个问题:
import matplotlib.pyplot as plt
import numpy
x_data=numpy.array([0, 1, 1.85, 1.9, 1.95, 2, 2.1, 2.5, 5, 10, 25])
y_data=numpy.array([0, 2.5, 1.8, 0.5, 0.2, 11, 1.2, 0.5, 0.15, 10, 25])
y_data_err=y_data*0.1
number_of_runs=3
index_lim=2
for iterator in range(number_of_runs):
fig666=plt.figure(666,figsize=(22.0/2.54,18.0/2.54))
#############################
# subplot
#ax = plt.subplot(3,1,3)
ax=fig666.add_axes([0.125,0.666,0.775,0.235])
ax.plot(x_data,y_data+iterator*0.2,marker=None)
ax.errorbar(x_data,y_data+iterator*0.2,yerr=y_data_err)
plt.semilogy()
#####################
# zoomed inset to subplot ##
subax1 = fig666.add_axes([0.5,0.71,0.35,0.16])
#subax1.plot(x_data,y_data+iterator*0.2+0.1,marker=None)
subax1.errorbar(x_data,y_data+iterator*0.5,yerr=y_data_err)
plt.xlim(1.87,2.25)
plt.ylim(0,3.7)
plt.show()
ax = plt.subplot(3,1,2)