matplotlib 将imshow的轴与图片中图形的轴对齐

ruoxqz4g  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(120)

我想在纸上画出一张图表。我用一个简单的imshow来绘制这幅图:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg    
img = mpimg.imread('screenshot.png')
plt.imshow(img)

字符串
现在,有没有一种方法可以对齐轴,这样我就可以画出我自己的电子密度数据,并与图中的数据进行比较?我尝试使用聊天GPT建议的缩放因子,但我不能使它工作。以下是它的建议:

# Data point in the picture
x_picture = 0.01

# Corresponding data point on the Python plot
x_python_plot = 80

# Calculate the scaling factor
scaling_factor = x_python_plot / x_picture

# Apply the scaling factor to your data for plotting
x_data_scaled = [x * scaling_factor for x in x_data]

# Plot your data on the new axes
ax.plot(x_data_scaled, y_data, color='red', linewidth=2)


(and对于y也是一样的,但是对于x本身已经不起作用了)。我认为plt.imshow(img,extend =[x1,x2,y1,y2])可以工作,如果我可以以某种方式确定x和y,但即使这样,x轴上的对数刻度也存在问题。我知道我可以裁剪图像,使轴与绘图的轴重合,但我宁愿不这样做,并保持图形的布局。
你的想法是赞赏!
下面是imshow加载的图片和原始图片,如果你想尝试一下。100d 1xx 1c 1d 1x的字符串

gmxoilav

gmxoilav1#

由于您的图像仅在有限的分辨率下可用,因此重叠图形的精度也将受到限制。
也就是说,你可以通过写下图片坐标轴的位置来定义两个坐标轴的转换因子和偏移量。我发现:

y=426 at the bottom (image value 30)
y=18 at the top (image value 100)

字符串
其导致以下等式系统:

30a + b = 426
100a + b = 18


这给出了y轴的转换a=-5.83b=601
类似地,在对这些值进行了一些处理之后,我发现x_scaled = 70*log(x) + 230在您的情况下工作得很好。
为了更清晰地表示,请删除图像周围的所有内容,如here所示:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from math import log

img = mpimg.imread('screenshot.png')

fig, ax = plt.subplots()
ax.imshow(img)
fig.subplots_adjust(left=0, bottom=0, right=1, top=1)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.set_xticks([])
ax.set_yticks([])

def scale_x(x):
    return 70*log(x, 10) + 230

def scale_y(y):
    return -5.83*y + 601

def scale_plot(x_arr, y_arr, ax=plt.gca()):
    x_arr_scaled = [scale_x(x) for x in x_arr]
    y_arr_scaled = [scale_y(y) for y in y_arr]
    ax.scatter(x_arr_scaled, y_arr_scaled) # feel free to use plot() instead

scale_plot([0.1, 1000, 10000], [60, 90, 50], ax)

plt.show()


点(0.1,60)、(1000,90)和(10000,50)的输出:


的数据

相关问题