Python 如何用两行x数据绘制一行y数据?

Python 如何用两行x数据绘制一行y数据?,python,matplotlib,formatting,Python,Matplotlib,Formatting,我想用1组y数据绘制一个图,与2组不同的(当然是连接的)x数据相关。我的数据如下所示: x1 x2 y 1,84596E17 100 18,96342 2,27684E17 102 18,15215 2,80198E17 104 15,40415 3,44059E17 106 16,13399 4,21554E17 108 15,51298 5,15396E17 110 14,92131 6,28797E17 112 15,25483 7,65554E17 1

我想用1组y数据绘制一个图,与2组不同的(当然是连接的)x数据相关。我的数据如下所示:

x1          x2  y
1,84596E17  100 18,96342
2,27684E17  102 18,15215
2,80198E17  104 15,40415
3,44059E17  106 16,13399
4,21554E17  108 15,51298
5,15396E17  110 14,92131
6,28797E17  112 15,25483
7,65554E17  114 14,81549
9,30146E17  116 15,3397
1,12785E18  118 14,76562
1,36485E18  120 14,5095
1,64844E18  122 13,24967
1,98711E18  124 12,79743
2,39083E18  126 12,53556
2,87119E18  128 12,32063
3,44172E18  130 11,95121
我想要(x1,y)的对数正态图作为主要信息。对于方向,我想添加第二个x轴(x2,y),它与绘图(x1,y)相匹配

有没有一种方法可以让matplotlib直接计算第二个x轴的比例,而不必知道x1和x2的功能连接?我还希望避免两次绘制相同的y数据,然后再尝试匹配轴限制,因为这意味着我必须知道x1和x2之间的函数

我添加了一个小草图,希望能让我的意图有点清楚(对不起质量)

谢谢你,lepakk

使用你的代码作为参考如下:

import matplotlib.pyplot as plt

x1 = [184596e17, 227684e17,280198e17, 344059e17, 421554e17, 515396e17]
x2 = [100, 102, 104, 106, 108, 110]
y = [1896342, 1815215, 1540415, 1613399, 1551298, 1492131]

fig=plt.figure()
ax=fig.add_subplot(111, label="1")
ax2=fig.add_subplot(111, label="2", frame_on=False)

ax.plot(x1, y, color="C0")
ax.set_xlabel("x label 1", color="C0")
ax.set_ylabel("y label 1", color="C0")

ax2.plot(x2, y, color="C1")
ax2.xaxis.tick_top()
ax2.set_xlabel('x label 2', color="C1") 
ax2.xaxis.set_label_position('top') 
ax2.tick_params(axis='x', colors="C1")


plt.savefig('stackoverflow.png', bbox_inches='tight')
plt.show()
相应的输出就是这个图像(只取6个值)。


如果您有任何问题,请告诉我:)

此解决方案非常危险,可能会导致难以追踪的严重错误,但如果您非常小心,它可能会帮助您获得所需的数据

基于此线程中另一个答案的数据,我们可以覆盖顶轴x记号位置和标签,说出我们想要的任何内容。警告:这会将数据值与标签分离,使其高度不可信并容易出现错误。我通常认为勾号标签覆盖是一种黑客行为,在进行科学、工程、数据探索时,甚至在准备解释图时,我都不赞同这种模式。但我们在这里,所以请小心

import matplotlib.pyplot as plt
x1 = [184596e17, 227684e17, 280198e17, 344059e17, 421554e17, 515396e17]
x2 = [100, 102, 104, 106, 108, 110]
y = [1896342, 1815215, 1540415, 1613399, 1551298, 1492131]

fig=plt.figure()
ax=fig.add_subplot(111, label="1")

ax.plot(x1, y, color="C0")
ax.set_xlabel("x label 1", color="C0")
ax.set_ylabel("y label 1")

ax2=ax.twiny()
ax2.set_xticks(x1)
ax2.set_xticklabels(x2)
ax2.plot(x1, y, color="C2", alpha=0)
ax2.xaxis.tick_top()
ax2.set_xlabel('x label 2', color="C1") 
ax2.tick_params(axis='x', colors="C1")

现在,辅助x轴上的记号标记与数据点对齐,并将其在其他“轴”空间中的相关值显示为记号标签。我必须绘制一个不可见的系列,以使两个x轴比例精确对齐(您也可以通过设置自己的XLIM来覆盖这一点)。这种方法实际上相当于向每个数据点添加注释,但稍微简洁一些

编辑:

不要忘记,如果您的数据点比所需记号的数量多得多,您可以跨过记号位置和标签,以获得每2个、3个或10个记号位置和标签

对于跨步Xtick,请使用:

stride=2
ax2.set_xticks(x1[::stride])
ax2.set_xticklabels(x2[::stride])


如果次x轴具有线性刻度,则可以通过将
xlims
设置为对应的第一个和最后一个值来强制进行对应

如果不可能存在此类线性刻度,则两个轴需要具有相同的对数刻度,并且可以通过第一个轴的值设置次轴的刻度位置。与这些位置对应的刻度标签必须由
x2
中的标签设置。需要删除通过对数刻度设置的次轴的次刻度

请注意,主x轴只有一个主刻度和许多次刻度。如果需要,这些次要标记还可以使用
set\u minor\u格式化程序(ticker.ScalarFormatter())
获取标签

从matplotlib导入pyplot作为plt
从matplotlib导入代码
将numpy作为np导入
数据=np.数组([[1.84596E17100,18.96342],
[2.27684E1710218.15215],
[2.80198E1710415.40415],
[3.44059E1710616.13399],
[4.21554E1710815.51298],
[5.15396E17110,14.92131],
[6.28797E17112,15.25483],
[7.65554E17114.81549],
[9.30146E17、116、15.3397],
[1.12785E181118,14.76562],
[1.36485E18120,14.5095],
[1.64844E18122,13.24967],
[1.98711E18、124、12.79743],
[2.39083E18126,12.53556],
[2.87119E1812812.32063],
[3.44172E18130,11.95121]]
x1=数据[:,0]
x2=data[:,1].astype(int)#更改为整数,因此它们会显示为整数
y=数据[:,2]
图,ax=plt.子批次()
ax.图(x1,y'或-')
ax.setxscale('log'))
ax.set_xlabel('x1(对数刻度)')
#ax.set_xlim(x1[0],x1[-1])#可选地设置更紧的xlim
ax.xaxis.set_minor_formatter(ticker.ScalarFormatter())#这显示了次刻度标签
ax2=ax.twiny()
ax2.set_xlabel('x2')
ax2.set_xlim(ax.get_xlim())#两个轴的限制完全相同
ax2.setxscale('log')
ax2.设置刻度(x1)#通过x1设置刻度位置,但通过x2设置标签
ax2.设置X个标签(x2)
ax2.xaxis.set_minor_locator(ticker.NullLocator())#删除旧的minor记号
ax2.grid(True,axis='x',ls=':')
plt.紧_布局()
plt.show()

您是否尝试过说plt.plot(x1,y)和plt.plot(x2,y)以及plt.show()?这可能会导致数据点不匹配,因为我可能不知道x1和x2的显式连接,例如,如果x1是对数刻度,而x2是线性的。这就是为什么我想有一种简单的方法来匹配两个轴,也许通过使用x1和X2中的数据点插值函数连接,你有没有试着看一下这个问题:是的,我看到了,但我觉得它对我的情况并不方便,因为你需要指定每一个勾号(对于我的数据集来说,这可能太拥挤了),或者你需要知道x1和x2之间的函数。啊,我明白了。这个问题呢:谢谢你的链接,这可能会有用。我会看看,如果我能用它找到解决方案,但现在,你的解决方案不是我要找的。应该只有一行数据;基本上,第二个x轴应该按一定方式缩放以适应(x1,y)数据。不太清楚您的意思,因为这只是使用相同的y来绘制两个数据集。是否要修改其中一个数据集?不,正如我所说,我不想修改任何数据集。我要绘制(x1,y),然后以某种方式缩放x2,例如(x1,y)和(x2,y)在绘图中完全相同。数据不应该修改,而是x2的缩放。谢谢您的输入。您的方式将