gpt4 book ai didi

python - 如何向 matplotlib 添加 2D 颜色条或色轮?

转载 作者:行者123 更新时间:2023-11-28 17:13:42 35 4
gpt4 key购买 nike

我正在分析样本的磁化图。获得梯度及其方向后,我将它们绘制为 HSV(从 -π 到 π 的方向映射到从 0 到 1 的 Hue,Value 是归一化的梯度)通过 img_rgb = mpl.colors 转换为 RGB .hsv_to_rgb(img_hsv).

我设法使用 vmin 和 vmax 添加了一个 HSV 颜色条,但这并没有显示梯度的大小:

plt.imshow(img_rgb, cmap='hsv', vmin=-180, vmax=180, extent=(0, 100, 0,100))
plt.xlabel('μm')
plt.ylabel('μm')
plt.colorbar()

My current plot :
enter image description here

理想情况下,我想添加一个色轮来编码方向和幅度(可能像极坐标图一样?)。如果那不可能,添加一个 2D 图,扩展当前颜色条以包括 x 轴上的梯度幅度。

次要情节显然是可能的,但它们看起来像是拼凑的。有没有更好的办法?

最佳答案

首先,如果您想要同时可视化两个不同的参数,您可以通过为它们分配两个不同的 channel (比如红色和绿色)来实现。这可以通过标准化你的两个二维数组并将它们提供给 imshow 来完成,类似于 this answer 堆叠.

如果您对方形 2d 颜色图感到满意,则可以通过创建 meshgrid 以相同的方式获得此颜色图,然后再次堆叠并提供给 imshow:

from matplotlib import pyplot as plt
import numpy as np

##generating some data
x,y = np.meshgrid(
np.linspace(0,1,100),
np.linspace(0,1,100),
)
directions = (np.sin(2*np.pi*x)*np.cos(2*np.pi*y)+1)*np.pi
magnitude = np.exp(-(x*x+y*y))


##normalize data:
def normalize(M):
return (M-np.min(M))/(np.max(M)-np.min(M))

d_norm = normalize(directions)
m_norm = normalize(magnitude)

fig,(plot_ax, bar_ax) = plt.subplots(nrows=1,ncols=2,figsize=(8,4))

plot_ax.imshow(
np.dstack((d_norm,m_norm, np.zeros_like(directions))),
aspect = 'auto',
extent = (0,100,0,100),
)

bar_ax.imshow(
np.dstack((x, y, np.zeros_like(x))),
extent = (
np.min(directions),np.max(directions),
np.min(magnitude),np.max(magnitude),
),
aspect = 'auto',
origin = 'lower',
)
bar_ax.set_xlabel('direction')
bar_ax.set_ylabel('magnitude')

plt.show()

结果是这样的:

square-shaped 2d colorbar

原则上,同样的事情也应该用极轴 Axes 来完成,但根据 this github ticket 中的评论, imshow 不支持极轴,我无法让 imshow 填满整个光盘。

编辑:

感谢 ImportanceOfBeingErnest 和 his answer对于另一个问题(color 关键字做到了),这里现在是一个使用 pcolormesh 的极轴上的二维颜色图。有一些注意事项,最值得注意的是,colors 维度在 theta 方向上需要比 meshgrid 小一个,否则颜色图有螺旋形式:

fig= plt.figure(figsize=(8,4))
plot_ax = fig.add_subplot(121)
bar_ax = fig.add_subplot(122, projection = 'polar')

plot_ax.imshow(
np.dstack((d_norm,m_norm, np.zeros_like(directions))),
aspect = 'auto',
extent = (0,100,0,100),
)

theta, R = np.meshgrid(
np.linspace(0,2*np.pi,100),
np.linspace(0,1,100),
)

t,r = np.meshgrid(
np.linspace(0,1,99),
np.linspace(0,1,100),
)

image = np.dstack((t, r, np.zeros_like(r)))

color = image.reshape((image.shape[0]*image.shape[1],image.shape[2]))

bar_ax.pcolormesh(
theta,R,
np.zeros_like(R),
color = color,
)

bar_ax.set_xticks(np.linspace(0,2*np.pi,5)[:-1])
bar_ax.set_xticklabels(
['{:.2}'.format(i) for i in np.linspace(np.min(directions),np.max(directions),5)[:-1]]
)
bar_ax.set_yticks(np.linspace(0,1,5))
bar_ax.set_yticklabels(
['{:.2}'.format(i) for i in np.linspace(np.min(magnitude),np.max(magnitude),5)]
)
bar_ax.grid('off')

plt.show()

这会产生这个数字:

working round 2d colormap

关于python - 如何向 matplotlib 添加 2D 颜色条或色轮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45626482/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com