Python plt散射不显示与imshow相同的点,且数据相同

Python plt散射不显示与imshow相同的点,且数据相同,python,numpy,matplotlib,graph,scatter,Python,Numpy,Matplotlib,Graph,Scatter,我试图将散点图上显示的点和值叠加到图像中。我有一个大小为(12001920,3)的图像和一个按(x,y,value)组织的点列表,我称之为uv,大小为(316425)。当我在散点图上显示这些点时,它们会按照我的要求显示。但是,当我尝试以大小数组(12001920)显示这些点,然后使用imshow显示时,不仅大多数点不显示,而且尺寸也向后显示。我不知道发生了什么,因为这两种情况下都是相同的数据。任何帮助都将不胜感激 代码: 结果: 编辑: 根据对答案的最新评论,这里是更新的结果切换,以使uv_n

我试图将散点图上显示的点和值叠加到图像中。我有一个大小为(12001920,3)的图像和一个按(x,y,value)组织的点列表,我称之为uv,大小为(316425)。当我在散点图上显示这些点时,它们会按照我的要求显示。但是,当我尝试以大小数组(12001920)显示这些点,然后使用imshow显示时,不仅大多数点不显示,而且尺寸也向后显示。我不知道发生了什么,因为这两种情况下都是相同的数据。任何帮助都将不胜感激

代码:

结果:

编辑: 根据对答案的最新评论,这里是更新的结果切换,以使uv_new现在具有形状(img.shape,img.shape[0]),并移动到uv_new[y,x]=z


我相信,您的代码片段中有一些错误

  • 您不需要
    uv_int
    ,因为当您计算x和y时,您使用
    astype(int)
    将它们转换为整数
  • count\u nonzero
    返回两个不同的值的原因可能是,在执行规范化时,对于z的多个非零值,您会得到一些重复的坐标(x,y)。应用上一点可能有助于丢弃一些重复项
  • 此调用
    uv_new[x,y]=z
    是您的
    imshow
    绘图被转置的原因。是的,
    x
    表示x轴,
    y
    表示y轴,但请记住,就显示矩阵而言,(行,列)实际上等同于(y,x)。因此,请将您的呼叫更新为
    uv_new[y,x]=z
    ,并更改
    uv_new
    的形状
  • 对每个绘图使用相同的颜色贴图。请避免使用喷射或彩虹。Matplotlib有翡翠、地狱、岩浆、等离子和cividis,这些都是您应该使用的很棒的彩色地图。例如,只需在
    imshow
    scatter
    的两个调用中添加关键字
    cmap='plasma'
编辑: 下面是一个随机生成数据的实际示例。前两个图与您所做的类似,只是使用了
imshow
interpolation
关键字。最后一个图与第二个图相似,但改变背景颜色以尝试匹配第一个图,并减小散射点的大小。看看第一个和最后一个图像是如何相似的?我想这大概解释了为什么你不能用imshow和scatter得到相同的图。代码段和下图(由于大小限制,图的质量非常差,因此请在您的计算机上执行代码段以获得质量更好的图像)


嘿!谢谢你的回复。如果更改轴,则在写入空数组时会出现边界错误(超出边界)。我不确定为什么会出现这种情况,因为我正在按image.size[0]标准化X,按image.size[1]标准化y。有什么想法吗?对不起,忘了提一下您还需要更改第一行:
uv\u new=np.zeros((img.shape[1],img.shape[0])
。谢谢!我这样做了,并且解决了横向问题,但是我仍然有一个问题,显示的点比散点图中的要少得多。你介意用新的结果更新你的问题所附的数字吗?
uv_new = np.zeros((img.shape[0],img.shape[1]))
max_depth = np.max((uv[2,:]).astype(np.float64)) # just a normalizer
uv_int = uv.astype(int) # Since I'm putting it in an array, I need integer x,y coordinates
print(img.shape)
x = (uv_int[0]/np.max(uv_int[0])*(img.shape[0]-1)).astype(int) # Normalize x coordinates
y = (uv_int[1]/np.max(uv_int[1])*(img.shape[1]-1)).astype(int) # Normalize y coordinates
z = 1-uv[2]/max_depth # The color values I want to show
uv_new[x,y] = z # Set the image I want to show with the color values
plt.imshow(uv_new,origin='lower') # Show this image which should contain all the points, but doesn't
print(np.count_nonzero(uv_new)) 
print(np.count_nonzero(z)) # Comparing these two just to show that no data is lost
plt.figure(figsize=(8,5))
#plt.imshow(img)
cm = plt.cm.get_cmap('jet')
scat = plt.scatter(x,y, c=z, s=1, cmap=cm) # What I want, but is different from the image above, even though it is the exact same data
#plt.axis('off')
plt.show()
import matplotlib.pyplot as plt
import numpy as np

rng = np.random.default_rng()
uv = rng.random(size=(3, 16425))
uv_new = np.zeros((1920, 1200))
x = (uv[0] / np.amax(uv[0]) * (uv_new.shape[1] - 1)).astype(int)
y = (uv[1] / np.amax(uv[1]) * (uv_new.shape[0] - 1)).astype(int)
z = 1 - uv[2] / np.amax(uv[2])
uv_new[y, x] = z
fig, (ax, bx, cx) = plt.subplots(nrows=1, ncols=3, num=0, figsize=(20, 10))
ax.imshow(uv_new, origin='lower', cmap='plasma', interpolation='bilinear')
bx.scatter(x, y, c=z, s=1, cmap='plasma')
cx.scatter(x, y, c=z, s=0.02, cmap='plasma')
cx.set_facecolor('xkcd:royal blue')
ax.set_aspect('equal')
ax.autoscale(enable=True, axis='both', tight=True)
bx.set_aspect('equal')
bx.autoscale(enable=True, axis='both', tight=True)
cx.set_aspect('equal')
cx.autoscale(enable=True, axis='both', tight=True)
fig.tight_layout()
fig.savefig('/home/thomas/so.png', bbox_inches='tight', dpi=200)
plt.show()