matplotlib 如何绘制由坐标轴定义间距的热图/相图

q1qsirdb  于 2023-10-24  发布在  其他
关注(0)|答案(2)|浏览(130)

我试着画一个相图,用x,y轴坐标定义正方形的面积,而不是等间距的。
例如,我有以下数组:

import numpy as np

x = np.array([ 10,  50, 100, 150])
y = np.array([100,  80,  60,  40,  20,  10,   5])
z = np.array([[0.31, 0.33, 0.34 , 0.34],
       [0.31, 0.34, 0.34, 0.34],
       [0.30, 0.34, 0.35, 0.34],
       [0.30, 0.33, 0.34 , 0.34],
       [0.29, 0.31, 0.31, 0.31],
       [0.29, 0.30, 0.30, 0.29],
       [0.28 , 0.28, 0.28 , 0.29]])

我试着用sns.heatmap()把它画成一个矩形,但是我不能根据x,y坐标改变正方形的面积,而不是相等的大小。
我得到这个结果:
热图

我还尝试了遵循我在这里找到的一个建议:Plotting a 2D heatmap使用这里修改的代码,如下所示,但这样的区域是不同的,但不完全正确:

import matplotlib.pyplot as plt
import numpy as np


z_min, z_max = np.abs(z).min(), np.abs(z).max()

fig, ax = plt.subplots()

c = ax.pcolormesh(x, y, z, cmap='RdBu', vmin=z_min, vmax=z_max, shading='auto', edgecolors='black')
ax.set_title('pcolormesh')
# set the limits of the plot to the limits of the data
ax.axis([x.min(), x.max(), y.min(), y.max()])
fig.colorbar(c, ax=ax)

plt.show()

这给出了这个结果,这似乎几乎是我想要的,但平方不是正确的大小,我不太明白为什么:
pcolormesh

如果我也能用每个方块的实际值来注解这个图,那就太好了!

xu3bshqb

xu3bshqb1#

pcolormeshxy表示单元格之间 * 边 * 的位置。如果水平方向有4个单元格,则有5条边。
假设给定的xy是单元格宽度,可以使用np.cumsum()计算边缘位置。

import matplotlib.pyplot as plt
import numpy as np

x = np.array([10, 50, 100, 150])
y = np.array([100, 80, 60, 40, 20, 10, 5])
z = np.array([[0.31, 0.33, 0.34, 0.34],
              [0.31, 0.34, 0.34, 0.34],
              [0.30, 0.34, 0.35, 0.34],
              [0.30, 0.33, 0.34, 0.34],
              [0.29, 0.31, 0.31, 0.31],
              [0.29, 0.30, 0.30, 0.29],
              [0.28, 0.28, 0.28, 0.29]])

fig, ax = plt.subplots()

x_edges = np.append([0], x.cumsum())
y_edges = np.append([0], y.cumsum())
c = ax.pcolormesh(x_edges, y_edges, z, cmap='RdBu', shading='auto', edgecolors='black')
ax.set_title('pcolormesh')
fig.colorbar(c, ax=ax)

plt.tight_layout()
plt.show()

边缘可用于计算单元格中心的位置,例如用x和y量标记行和列。

x_mids = (x_edges[:-1] + x_edges[1:]) / 2
y_mids = (y_edges[:-1] + y_edges[1:]) / 2
ax.set_xticks(x_mids, x)
ax.set_yticks(y_mids, y)

kcrjzv8t

kcrjzv8t2#

import matplotlib.pyplot as plt
import numpy as np

x = np.array([10, 50, 100, 150])
y = np.array([100, 80, 60, 40, 20, 10, 5])
z = np.array([[0.31, 0.33, 0.34, 0.34],
              [0.31, 0.34, 0.34, 0.34],
              [0.30, 0.34, 0.35, 0.34],
              [0.30, 0.33, 0.34, 0.34],
              [0.29, 0.31, 0.31, 0.31],
              [0.29, 0.30, 0.30, 0.29],
              [0.28, 0.28, 0.28, 0.29]])

fig, ax = plt.subplots()
ax.set_aspect('equal')

x_edges = np.append([0], x)#.cumsum())
y_edges = np.append([0], y)#.cumsum())

c = ax.pcolormesh(x_edges, y_edges, z, cmap='RdBu', shading='auto', edgecolors='black')

ax.set_xticks(x) #_edges[1:], x)
ax.set_yticks(y) #_edges[1:], y)

ax.set_title('pcolormesh')
fig.colorbar(c, ax=ax)

plt.tight_layout()
plt.show()

相关问题