从三个一维数组创建热图
Create a heat map out of three 1D arrays
我想用 3 个一维数组创建一个热图。看起来像这样的东西:
到目前为止,我只能创建一个散点图,其中标记具有不同的颜色和标记大小,具体取决于第三个值:
我的代码:
xf = np.random.rand(1000)
yf = np.random.rand(1000)
zf = 1e5*np.random.rand(1000)
ms1 = (zf).astype('int')
from matplotlib.colors import LinearSegmentedColormap
# Remove the middle 40% of the RdBu_r colormap
interval = np.hstack([np.linspace(0, 0.4), np.linspace(0.6, 1)])
colors = plt.cm.RdBu_r(interval)
cmap = LinearSegmentedColormap.from_list('name', colors)
col = cmap(np.linspace(0,1,len(ms1)))
#for i in range(len(ms1)):
plt.scatter(xf, yf, c=zf, s=5*ms1/1e4, cmap=cmap,alpha=0.8)#, norm =matplotlib.colors.LogNorm())
ax1 =plt.colorbar(pad=0.01)
给我这个结果:
知道如何让它看起来像第一个图吗?
基本上我想做的是找到 x 和 y 数组组的 z 值的平均值
我认为 scipy.stats.binned_statistic_2d
提供了您正在寻找的功能。您可以使用它将 xf
和 yf
数组的值组织到二维箱中,并计算每个箱中 zf
值的平均值:
import numpy as np
from scipy import stats
np.random.seed(0)
xf = np.random.rand(1000)
yf = np.random.rand(1000)
zf = 1e5 * np.random.rand(1000)
means = stats.binned_statistic_2d(xf,
yf,
values=zf,
statistic='mean',
bins=(5, 5))[0]
然后你可以使用例如seaborn 绘制平均值数组的热图:
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 8))
sns.heatmap(means,
cmap="Reds_r",
annot=True,
annot_kws={"fontsize": 16},
cbar=True,
linewidth=2,
square=True)
plt.show()
这给出:
我想用 3 个一维数组创建一个热图。看起来像这样的东西:
到目前为止,我只能创建一个散点图,其中标记具有不同的颜色和标记大小,具体取决于第三个值:
我的代码:
xf = np.random.rand(1000)
yf = np.random.rand(1000)
zf = 1e5*np.random.rand(1000)
ms1 = (zf).astype('int')
from matplotlib.colors import LinearSegmentedColormap
# Remove the middle 40% of the RdBu_r colormap
interval = np.hstack([np.linspace(0, 0.4), np.linspace(0.6, 1)])
colors = plt.cm.RdBu_r(interval)
cmap = LinearSegmentedColormap.from_list('name', colors)
col = cmap(np.linspace(0,1,len(ms1)))
#for i in range(len(ms1)):
plt.scatter(xf, yf, c=zf, s=5*ms1/1e4, cmap=cmap,alpha=0.8)#, norm =matplotlib.colors.LogNorm())
ax1 =plt.colorbar(pad=0.01)
给我这个结果:
知道如何让它看起来像第一个图吗?
基本上我想做的是找到 x 和 y 数组组的 z 值的平均值
我认为 scipy.stats.binned_statistic_2d
提供了您正在寻找的功能。您可以使用它将 xf
和 yf
数组的值组织到二维箱中,并计算每个箱中 zf
值的平均值:
import numpy as np
from scipy import stats
np.random.seed(0)
xf = np.random.rand(1000)
yf = np.random.rand(1000)
zf = 1e5 * np.random.rand(1000)
means = stats.binned_statistic_2d(xf,
yf,
values=zf,
statistic='mean',
bins=(5, 5))[0]
然后你可以使用例如seaborn 绘制平均值数组的热图:
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 8))
sns.heatmap(means,
cmap="Reds_r",
annot=True,
annot_kws={"fontsize": 16},
cbar=True,
linewidth=2,
square=True)
plt.show()
这给出: