【发布时间】:2017-03-04 16:10:59
【问题描述】:
(旧版问题如下)
我正在定义以下自定义颜色图,其中我将白色 (#ffffff) 分配给浮点数 zero_pt。
import matplotlib.colors as col
from matplotlib.colors import LinearSegmentedColormap
zero_pt = 0.98181818181818181
cmap = LinearSegmentedColormap.from_list(
'mycmap', [(0, 'blue'), (zero_pt, 'white'), (1, 'red')])
但是当我尝试从相同的 zero_pt 值中检索十六进制颜色代码时,我没有得到 #ffffff(即:白色),正如我所期望的那样:
rgb = cmap(zero_pt)[:3]
print(col.rgb2hex(rgb))
> u'#ffdcdc'
为什么会这样?我该如何解决这个问题?
这里是老问题
我需要定义一个自定义颜色图,其中负值显示为蓝色,零值显示为白色,正值显示为红色。代码如下,必要的数据文件在这里(data.pkl)和这里(edges.pkl)。
import pickle
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
with open('data.pkl', 'r') as f:
H = pickle.load(f)
with open('edges.pkl', 'r') as f:
edges = pickle.load(f)
# Define zero point for empty bins which should be colored in white.
zero_pt = 1. - H.max() / (H.max() - H.min())
print(H.min(), H.max(), zero_pt)
cmap = LinearSegmentedColormap.from_list(
'mycmap', [(0, 'blue'), (zero_pt, 'white'), (1, 'red')])
Y, X = np.meshgrid(edges[0], edges[1])
plt.pcolormesh(X, Y, H, cmap=cmap, vmin=H.min(), vmax=H.max())
plt.show()
这会导致
如果我们检查H 数组,我们会看到很多零值应该显示为白色,而在上图中显示为粉红色。
这不会发生在我使用的所有数据中,它只是偶尔发生。我认为这个问题与四舍五入有关?有没有办法强制像这种情况一样以白色显示零值?
【问题讨论】:
-
您在生成
LinearSegmentedColormap.from_list(name, colors, N=256, gamma=1.0)时使用了默认的颜色数量;我会尝试指定N=20左右,看看四舍五入是否适合人类感知。 (您可能需要将zero_pt向下舍入一点,使其落在白色段的内部。) -
降低
N会使情况变得更糟(颜色变得更红)。如果我使用N=500,我会得到fffdfd,它足够接近白色,但我不确定我在用它做什么。 -
LinearSegmentedColormap.from_list() 的文档说
N is the number of rgb quantization levels,所以我想如果我需要更高的精度,我应该增加这个值? -
放入颜色条以查看升高/降低
N的作用。 (这是颜色段的数量。)
标签: python matplotlib