我正在使用canvas.mpl_connect鼠标单击侦听器来绘制我的100x100等值线图,其中xlim从0到99。这样做,我得到了例如x,y= 10,20。但是,我必须显示具有不同坐标的第二个x轴(例如,xlim从0.01到1),但我不希望event.xdata以第二个轴的样式返回坐标。有这样做的可能性吗?
发布于 2021-04-16 19:21:25
您可以使用matplotlib中的transformations。您可能希望从ax2中的数据坐标转换为显示坐标(这在两个轴之间是通用的),然后转换为ax1的数据坐标。有用的是,您可以组合转换。
例如:
import matplotlib.pyplot as plt
import numpy as np
fig, ax1 = plt.subplots(1)
# First axis, with x-values going from 0 to 100
x1 = np.linspace(0, 100, 101)
y1 = np.sin(2 * np.pi * x1 / max(x1))
ax1.plot(x1, y1, 'b.-')
# Second axis, x values going from 0 to 1
ax2 = ax1.twiny()
x2 = np.linspace(0, 1, 11)
y2 = np.cos(2 * np.pi * x2 / max(x2))
ax2.plot(x2, y2, 'r.-')
# Create a combined transform from ax2 data to ax1 data
combinedTransform = ax2.transData + ax1.transData.inverted()
def onclick(event):
# event has x and y in data coordinates for ax2:
pt_data2 = (event.xdata, event.ydata)
# Convert them into data coordinates for ax1:
pt_data1 = combinedTransform.transform(pt_data2)
# ...
cid = fig.canvas.mpl_connect('button_press_event', onclick)感觉有一种更好的方法(以某种方式告诉事件侦听器您希望xdata和ydata对哪个轴有效,但我不知道。对不起)
发布于 2021-04-19 18:45:10
谢谢,我也实现了类似的东西。问题是,在我的数据背后实际上没有直接的线性转换。我解决了这个问题,只需在完成设置标记或选择点后调用函数中的第二个轴。这本书并不漂亮,但作为硕士论文应该没问题!
https://stackoverflow.com/questions/67122599
复制相似问题