matplotlib - 从二维数组中随机选取 N 个点,绘制空间散点图
matplotlib - randomly pick N points from 2D array, and plot spatial scatter plot
我有如下图:
左图:原始 100 * 100 numpy 数据
右图:我想要的-从原始数据中随机选择N个数据,绘制在曲面图上
如何从左图中随机选择N个数据,并像右图一样在散点图上绘制所选数据?
我用ax.imshow(data)
生成了左边的曲面图。 data
是一个二维 numpy 数组。
您只需从二维图上的 10,000 (100 x 100) 个唯一点中选择 N 个数字。我假设你想要没有更换。然后你可以 "unravel" 它们到你的 x,y 坐标上。
random_choices = np.random.choice(10000, size=N, replace=False)
x, y = np.unravel_index(random_choices, (100, 100))
您可以使用这些索引来适当地创建散点图和大小点:
data = np.random.random((100, 100))
plt.scatter(x, y, s=data[y, x])
如果您想根据图像为随机选择的点着色,您可以对散点使用与图像相同的颜色图和归一化。
import numpy as np
import matplotlib.pyplot as plt
original_data = np.random.rand(100,100)
fig, (ax, ax2) = plt.subplots(ncols=2)
im = ax.imshow(original_data, cmap="summer")
N = 89
x = np.random.randint(0,100,size=N)
y = np.random.randint(0,100,size=N)
random_sample = original_data[x,y]
sc = ax2.scatter(x,y,c=random_sample, cmap=im.cmap, norm=im.norm)
ax2.set_aspect("equal")
ax2.set(xlim=ax.get_xlim(), ylim=ax.get_ylim())
fig.colorbar(sc, ax=[ax,ax2], orientation="horizontal")
plt.show()
我有如下图:
左图:原始 100 * 100 numpy 数据
右图:我想要的-从原始数据中随机选择N个数据,绘制在曲面图上
如何从左图中随机选择N个数据,并像右图一样在散点图上绘制所选数据?
我用ax.imshow(data)
生成了左边的曲面图。 data
是一个二维 numpy 数组。
您只需从二维图上的 10,000 (100 x 100) 个唯一点中选择 N 个数字。我假设你想要没有更换。然后你可以 "unravel" 它们到你的 x,y 坐标上。
random_choices = np.random.choice(10000, size=N, replace=False)
x, y = np.unravel_index(random_choices, (100, 100))
您可以使用这些索引来适当地创建散点图和大小点:
data = np.random.random((100, 100))
plt.scatter(x, y, s=data[y, x])
如果您想根据图像为随机选择的点着色,您可以对散点使用与图像相同的颜色图和归一化。
import numpy as np
import matplotlib.pyplot as plt
original_data = np.random.rand(100,100)
fig, (ax, ax2) = plt.subplots(ncols=2)
im = ax.imshow(original_data, cmap="summer")
N = 89
x = np.random.randint(0,100,size=N)
y = np.random.randint(0,100,size=N)
random_sample = original_data[x,y]
sc = ax2.scatter(x,y,c=random_sample, cmap=im.cmap, norm=im.norm)
ax2.set_aspect("equal")
ax2.set(xlim=ax.get_xlim(), ylim=ax.get_ylim())
fig.colorbar(sc, ax=[ax,ax2], orientation="horizontal")
plt.show()