Python:在循环中以对数对数比例绘制误差条,然后保存图像
Python: Plotting errorbars in a loglog scale, in a loop and then saving the image
我有 58 个文件需要绘制。其中一些是空的(不重要,我已经用 if 条件跳过了它们)。我需要绘制文件中的数据,使用对数对数刻度和误差线。最后我想保存情节。
我正在使用 Python,spyder。
我写了以下代码:
route='/......./'
L=np.arange (1,59, 1)
for i in range (L.shape[0]):
I=L[i]
name_sq= 'Spectra_without_quiescent_'+('{}'.format(I))+'.dat'
Q=np.loadtxt(route+name_sq)
if (len(Q) != 0):
x=Q[:,1]
y=Q[:,2]
z=Q[:,3]
fig=plt.errorbar(x,y,yerr=z, fmt = 'b')
fig.set_yscale('log')
fig.set_xscale('log')
xlabel='Frequency'
ylabel='Flux'
title='Spectrum_'+('{}'.format(I))+'.dat'
name='Spectrum_without_quiescent_'+('{}'.format(I))+'.pdf'
fig.savefig(route+name, fig)
然而,当我 运行 它时,我得到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 540, in runfile
execfile(filename, namespace)
File "/media/chidiac/My Passport/DOCUMENTS/My_Publications/2-3C273_radio_spectra/Maximum_flux_code.py", line 49, in <module>
fig.set_yscale('log')
AttributeError: 'ErrorbarContainer' object has no attribute 'set_yscale'
我仍然是 Python 的初学者,我找不到错误或如何修复它。
非常感谢任何帮助。
我的一个朋友帮我解决了这个问题,如果有人感兴趣,这里是解决方案:
route='/....../'
L=np.arange (1,59, 1)
print L
for i in range (L.shape[0]):
I=L[i]
name_sq= 'Spectra_without_quiescent_'+('{}'.format(I))+'.dat'
Q=np.loadtxt(route+name_sq)
if (len(Q) != 0):
x=np.log(Q[:,1])
y=np.log(Q[:,2])
z=np.log(Q[:,3])
fig, ax = plt.subplots(facecolor='w', edgecolor='k')
plt.errorbar(x,y,yerr=z, fmt = 'b')
plt.ylabel('Flux', size='x-large')
plt.xlabel('Frequency', size='x-large')
title='Spectrum_'+('{}'.format(I))+'.dat'
name='Spectrum_without_quiescent_'+('{}'.format(I))+'.pdf'
pylab.savefig(route+name)
第一个技巧是,首先获取数据的对数值,然后绘制它们。由于我不知道有任何命令可以让我在对数刻度中绘制误差线,所以我认为这是最好的解决方案。
第二个技巧是使用子图。否则,我在一个图中得到了 58 条曲线,58 次。
希望此解决方案对您有所帮助。
这个 post 可能有点旧,但是我遇到了同样的问题,也许这对以后的其他人有帮助。
您最初的解决方案实际上几乎是正确的。但是, set_yscale
是坐标轴的方法,而不是图形。因此,您在 if 语句中的代码应如下所示:
import matplotlib.pyplot as plt
# other stuff you did ..
x=Q[:,1]
y=Q[:,2]
z=Q[:,3]
fig = plt.figure()
ax = plt.axes()
ax.set_xscale("log")
ax.set_yscale("log")
ax.errorbar(x,y,yerr=z, fmt = 'b')
ax.set_xlabel("Frequency")
ax.set_ylabel("Flux")
ax.set_title("Spectrum_{}.dat".format(I))
name="Spectrum_without_quiescent_{}.pdf".format(I)
plt.savefig(route+name)
这里我也调整了你对format
函数的使用。
请注意,您的第二种解决方案并不总是正常工作。如果您有非常小的值和小误差线,这些小值的对数将变大(例如 log(10^(-6)) = -6,因为使用以 10 为底的对数)并且您将有巨大的误差线,尽管您的实际误差很小
长话短说:使用 ax.set_*scale
。很安全。
我有 58 个文件需要绘制。其中一些是空的(不重要,我已经用 if 条件跳过了它们)。我需要绘制文件中的数据,使用对数对数刻度和误差线。最后我想保存情节。 我正在使用 Python,spyder。 我写了以下代码:
route='/......./'
L=np.arange (1,59, 1)
for i in range (L.shape[0]):
I=L[i]
name_sq= 'Spectra_without_quiescent_'+('{}'.format(I))+'.dat'
Q=np.loadtxt(route+name_sq)
if (len(Q) != 0):
x=Q[:,1]
y=Q[:,2]
z=Q[:,3]
fig=plt.errorbar(x,y,yerr=z, fmt = 'b')
fig.set_yscale('log')
fig.set_xscale('log')
xlabel='Frequency'
ylabel='Flux'
title='Spectrum_'+('{}'.format(I))+'.dat'
name='Spectrum_without_quiescent_'+('{}'.format(I))+'.pdf'
fig.savefig(route+name, fig)
然而,当我 运行 它时,我得到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 540, in runfile
execfile(filename, namespace)
File "/media/chidiac/My Passport/DOCUMENTS/My_Publications/2-3C273_radio_spectra/Maximum_flux_code.py", line 49, in <module>
fig.set_yscale('log')
AttributeError: 'ErrorbarContainer' object has no attribute 'set_yscale'
我仍然是 Python 的初学者,我找不到错误或如何修复它。 非常感谢任何帮助。
我的一个朋友帮我解决了这个问题,如果有人感兴趣,这里是解决方案:
route='/....../'
L=np.arange (1,59, 1)
print L
for i in range (L.shape[0]):
I=L[i]
name_sq= 'Spectra_without_quiescent_'+('{}'.format(I))+'.dat'
Q=np.loadtxt(route+name_sq)
if (len(Q) != 0):
x=np.log(Q[:,1])
y=np.log(Q[:,2])
z=np.log(Q[:,3])
fig, ax = plt.subplots(facecolor='w', edgecolor='k')
plt.errorbar(x,y,yerr=z, fmt = 'b')
plt.ylabel('Flux', size='x-large')
plt.xlabel('Frequency', size='x-large')
title='Spectrum_'+('{}'.format(I))+'.dat'
name='Spectrum_without_quiescent_'+('{}'.format(I))+'.pdf'
pylab.savefig(route+name)
第一个技巧是,首先获取数据的对数值,然后绘制它们。由于我不知道有任何命令可以让我在对数刻度中绘制误差线,所以我认为这是最好的解决方案。 第二个技巧是使用子图。否则,我在一个图中得到了 58 条曲线,58 次。
希望此解决方案对您有所帮助。
这个 post 可能有点旧,但是我遇到了同样的问题,也许这对以后的其他人有帮助。
您最初的解决方案实际上几乎是正确的。但是, set_yscale
是坐标轴的方法,而不是图形。因此,您在 if 语句中的代码应如下所示:
import matplotlib.pyplot as plt
# other stuff you did ..
x=Q[:,1]
y=Q[:,2]
z=Q[:,3]
fig = plt.figure()
ax = plt.axes()
ax.set_xscale("log")
ax.set_yscale("log")
ax.errorbar(x,y,yerr=z, fmt = 'b')
ax.set_xlabel("Frequency")
ax.set_ylabel("Flux")
ax.set_title("Spectrum_{}.dat".format(I))
name="Spectrum_without_quiescent_{}.pdf".format(I)
plt.savefig(route+name)
这里我也调整了你对format
函数的使用。
请注意,您的第二种解决方案并不总是正常工作。如果您有非常小的值和小误差线,这些小值的对数将变大(例如 log(10^(-6)) = -6,因为使用以 10 为底的对数)并且您将有巨大的误差线,尽管您的实际误差很小
长话短说:使用 ax.set_*scale
。很安全。