我正在分析样品的磁化映射。获得渐变及其方向后,我将它们绘制为 HSV(从 -? 到 ? 的方向映射到 Hue 从 0 到 1,Value 是归一化的渐变)通过img_rgb = mpl.colors.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()
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想添加一个色轮来编码方向和幅度(可能类似于极坐标图?)。如果这是不可能的,请添加一个 2D 图,它扩展当前颜色条以包括 x 轴上的梯度幅度。
次要情节显然是可能的,但它们似乎是杂七杂八的。有没有更好的办法?
首先,如果您有两个不同的参数想要同时可视化,您可以通过为它们分配两个不同的通道(例如红色和绿色)来实现。imshow这可以通过规范化两个二维数组并将它们馈送到类似于此答案的堆栈来完成。
如果您对方形 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()
Run Code Online (Sandbox Code Playgroud)
结果如下:
原则上,同样的事情也应该可以用极轴完成Axes,但根据此 github 票证中的评论,imshow不支持极轴,我无法imshow填充整个光盘。
编辑:
感谢 ImportanceOfBeingErnest 和他对另一个问题的回答color(关键字做到了),这里现在使用pcolormesh. 有一些警告,最值得注意的是,colors尺寸需要比meshgridintheta方向小一,否则颜色图具有螺旋形式:
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()
Run Code Online (Sandbox Code Playgroud)
这会产生这个数字:
| 归档时间: |
|
| 查看次数: |
2012 次 |
| 最近记录: |