Python matplotlib pyplot 2在同一图形中使用不同的轴进行绘图

Python matplotlib pyplot 2在同一图形中使用不同的轴进行绘图,python,matplotlib,plot,axes,Python,Matplotlib,Plot,Axes,我对matplotlib.pyplot有一个小问题,我希望以前有人遇到过 我有数据包含X,Y,e值,它们是变量的X,Y测量值,e是Y中测量值的误差。我需要用对数标度绘制它们 我使用plt.errorbars函数来绘制它们,然后将yscale和xscale设置为log,这样就可以了。但我也需要在同一张图上画一条直线,需要以线性比例 我能够有单独的绘图做得很好,但我想有他们在同一张图片,如果可能的话。你有什么想法吗?我正在发布我现在所做的事情 干杯, 基蒙 按照莫莉的建议,我努力接近我的目标,但仍然

我对matplotlib.pyplot有一个小问题,我希望以前有人遇到过

我有数据包含X,Y,e值,它们是变量的X,Y测量值,e是Y中测量值的误差。我需要用对数标度绘制它们

我使用plt.errorbars函数来绘制它们,然后将yscale和xscale设置为log,这样就可以了。但我也需要在同一张图上画一条直线,需要以线性比例

我能够有单独的绘图做得很好,但我想有他们在同一张图片,如果可能的话。你有什么想法吗?我正在发布我现在所做的事情

干杯, 基蒙

按照莫莉的建议,我努力接近我的目标,但仍然没有达到。我正在为我正在尝试做的事情添加更多的信息,这可能会澄清一些事情

我正在将ax1设置为使用loglog scale的errobar图。我需要使用errorbar而不是loglog plot,这样我可以用我的点显示错误

我正在使用ax2以线性比例绘制线性拟合

此外,我不希望x轴和y轴显示10的101001000次方的值,但我自己的轴标签具有我想要的间距,因此我使用plt.xticks。我尝试了ax1.set_-yticks和ax1.set_-ytickbles,但没有成功。下面是我得到的图像

我没有足够的声誉发布图片,但这里是它上传的链接


“我的点”的值应该是x范围=40-80,y范围=5-200,因为拟合线现在是这样。

您可以使用的“添加”方法创建两个重叠轴。下面是一个例子:

from matplotlib import pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
ax2 = fig.add_axes(ax1.get_position(), frameon=False)

ax1.loglog([1,10,100,1000],[1000,1,100,10])
ax2.plot([5,10,11,13],'r')

plt.show()

然后,可以关闭线性比例打印的x和y记号,如下所示:

ax2.set_xticks([])
ax2.set_yticks([])

我无法使用errorbar函数获得两组轴,因此我必须将所有内容转换为对数比例,包括线性图。下面是我用来获取可能对某人有用的代码

plt.errorbar(data[0],data[1],yerr=data[2],fmt='o')
plt.xscale('log',basex=10)
plt.yscale('log',basey=10)
plt.plot(data[0],data[0]**aslope*10**binter,'r')
plt.plot(data[0],data[0]**(aslope-aerr)*10**(binter+berr),'--')
plt.plot(data[0],data[0]**(aslope+aerr)*10**(binter-berr),'--')
plt.xticks(freqlist,freqlist.astype('int'))
plt.yticks(tdlist,tdlist.astype('float'))
plt.xlabel('Frequency (MHz)')
plt.ylabel('t_s (msec)')
fitndx1 = 'Fit slope '+"{0:.2f}".format(aslope)+u"\u00B1"+"{0:.2f}".format(aerr)
plt.legend(('Data',fitndx1))
plt.show()
这里是最终图像的链接


谢谢你,Molly我已经用你的评论更新了我的问题。
plt.errorbar(data[0],data[1],yerr=data[2],fmt='o')
plt.xscale('log',basex=10)
plt.yscale('log',basey=10)
plt.plot(data[0],data[0]**aslope*10**binter,'r')
plt.plot(data[0],data[0]**(aslope-aerr)*10**(binter+berr),'--')
plt.plot(data[0],data[0]**(aslope+aerr)*10**(binter-berr),'--')
plt.xticks(freqlist,freqlist.astype('int'))
plt.yticks(tdlist,tdlist.astype('float'))
plt.xlabel('Frequency (MHz)')
plt.ylabel('t_s (msec)')
fitndx1 = 'Fit slope '+"{0:.2f}".format(aslope)+u"\u00B1"+"{0:.2f}".format(aerr)
plt.legend(('Data',fitndx1))
plt.show()