我试图创建一个可变色的图像(特别是HSV配色方案的H和V值,同时保持S不变),同时表示给定函数对这些颜色的响应。
实际上,它是热图,其中x和y轴是颜色而不是数字。通过matplotlib库进行搜索,我可以找到许多基于颜色栏的示例,例如找到here和here的颜色栏。
使用这些重要注意事项,colorbar实现已接近我所寻找的内容:
第二点听起来微不足道,但遗憾的是我还没有找到任何记录的方法来实现它。
有没有办法在matplotlib中创建这样的图,这比在Animal
或类似的低级可视化库中从头创建它要少得多?
答案 0 :(得分:1)
我还不太确定;但是我试一试。对不起,如果我误解了它。
主要想法是使用GridSpec
来解决您的两个要求:对齐"颜色轴"并将它们放在经典轴旁边。对齐应该是正确的,因为ax_x
/ ax_y
和主ax
之间的对应轴是相同的。
import matplotlib.pyplot as plt
from matplotlib.colors import hsv_to_rgb
from matplotlib.gridspec import GridSpec
import numpy as np
# Create a spectrum sample
# Convert HSV to RGB so that matplotlib can plot;
# hsv_to_rgb assumes values to be in range [0, 1]
N = 0.001
v_y, h_x = np.mgrid[0:1:N, 0:1:N]
c = hsv_to_rgb(np.stack([h_x, np.ones(h_x.shape), v_y], axis=2))
c_x = hsv_to_rgb(np.stack([h_x, np.ones(h_x.shape), np.zeros(v_y.shape)], axis=2))
c_y = hsv_to_rgb(np.stack([np.zeros(h_x.shape), np.ones(h_x.shape), v_y], axis=2))
fig = plt.figure()
# Ratio to adjust width for "x axis" and "y axis"
fig_ratio = np.divide(*fig.get_size_inches())
gs = GridSpec(2, 2, wspace=0.0, hspace=0.0,
width_ratios=[1, 20], height_ratios=[20/fig_ratio, 1])
# Lower-left corner is ignored
ax_y = plt.subplot(gs[0])
ax = plt.subplot(gs[1])
ax_x = plt.subplot(gs[3])
# Image are stretched to fit the ax since numbers are hided or not important in this figure.
img = ax.imshow(c, aspect='auto', origin='lower')
# Colorbar on img won't give correct results since it is plot with raw RGB values
img_x = ax_x.imshow(c_x, aspect='auto', origin='lower')
img_y = ax_y.imshow(c_y, aspect='auto', origin='lower')
# Remove ticks and ticklabels
for ax in [ax_y, ax, ax_x]:
ax.tick_params(left=False, bottom=False,
labelleft=False, labelbottom=False)
plt.show()
为了澄清,您是通过将它们分配给网格的象限来制作三个图并使用imshow图作为轴?
是的,它是一个2x2网格,我忽略了左下角的网格。文档可能不是很好,但我所做的与this part类似。
大概如果我想在这里和主要情节之间增加空间,我会增加wspace和hspace吗?
是的,它在this part文档中进行了简要说明。此外,我使用width_ratios
和height_ratios
对其进行了调整,以使图中的3个部分的大小不同,例如this。
另外,为了确认,此图像底部有一个完全黑色的轴,并且它不是左轴的错位。
底部是彩色x轴。它是黑色的,因为我认为它对应于v=0
。如果你改变了
c_x = hsv_to_rgb(np.stack([h_x, np.ones(h_x.shape), np.zeros(v_y.shape)], axis=2))
到
c_x = hsv_to_rgb(np.stack([h_x, np.ones(h_x.shape), np.ones(v_y.shape)], axis=2))
你会得到这个数字,证明它没有错位:
如果它更容易,您也可以忽略整个hsv事物,使用灰色框或其他东西作为中心图像。
对不起,我对此感到很沮丧。我仍然不知道你想在图中展示什么。所以我不知道如何提供帮助。如果您删除或注释掉该行
img = ax.imshow(c, aspect='auto', origin='lower')
你得到了这个: