gpt4 book ai didi

python - 更正 matplotlib 颜色条刻度

转载 作者:IT老高 更新时间:2023-10-28 21:00:59 26 4
gpt4 key购买 nike

我在等值线图旁边放置了一个颜色条。因为要绘制的数据是离散值而不是连续值,所以我使用了 LinearSegmentedColormap(使用 the recipe from the scipy cookbook ),我用我的最大计数值 + 1 对其进行了初始化,以显示 0 的颜色。但是,我现在有两个问题:

enter image description here

  1. 刻度标签的间距不正确(5 个或多或少除外)——它们应该位于它们识别的颜色的中间;即 0 - 4 应该上移,6 - 10 应该下移。

  2. 如果我用 drawedges=True 初始化颜色条,以便我可以设置其 dividers 属性的样式,我会得到:

enter image description here

我正在像这样创建我的颜色图和颜色条:

cbmin, cbmax = min(counts), max(counts)
# this normalises the counts to a 0,1 interval
counts /= np.max(np.abs(counts), axis=0)
# density is a discrete number, so we have to use a discrete color ramp/bar
cm = cmap_discretize(plt.get_cmap('YlGnBu'), int(cbmax) + 1)
mappable = plt.cm.ScalarMappable(cmap=cm)
mappable.set_array(counts)
# set min and max values for the colour bar ticks
mappable.set_clim(cbmin, cbmax)
pc = PatchCollection(patches, match_original=True)
# impose our colour map onto the patch collection
pc.set_facecolor(cm(counts))
ax.add_collection(pc,)
cb = plt.colorbar(mappable, drawedges=True)

所以我想知道将计数转换为 0,1 间隔是否是问题之一。

更新:

尝试了 Hooked 的建议后,0 值是正确的,但后续值会逐渐设置得更高,达到 9 应该是 10 的点:

enter image description here

这是我使用的代码:

cb = plt.colorbar(mappable)
labels = np.arange(0, int(cbmax) + 1, 1)
loc = labels + .5
cb.set_ticks(loc)
cb.set_ticklabels(labels)

为了确认,labels 肯定有正确的值:

In [3]: np.arange(0, int(cbmax) + 1, 1)
Out[3]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

最佳答案

您遇到了一个错误。您有 10 个刻度标签分布在 11 种颜色中。您可以通过使用 np.linspace 而不是 np.arange 来更正错误。使用 np.linspace 第三个参数是所需值的数量。这减少了避免一对一错误所需的心理体操量:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm
import matplotlib.colors as mcolors

def colorbar_index(ncolors, cmap):
cmap = cmap_discretize(cmap, ncolors)
mappable = cm.ScalarMappable(cmap=cmap)
mappable.set_array([])
mappable.set_clim(-0.5, ncolors+0.5)
colorbar = plt.colorbar(mappable)
colorbar.set_ticks(np.linspace(0, ncolors, ncolors))
colorbar.set_ticklabels(range(ncolors))

def cmap_discretize(cmap, N):
"""Return a discrete colormap from the continuous colormap cmap.

cmap: colormap instance, eg. cm.jet.
N: number of colors.

Example
x = resize(arange(100), (5,100))
djet = cmap_discretize(cm.jet, 5)
imshow(x, cmap=djet)
"""

if type(cmap) == str:
cmap = plt.get_cmap(cmap)
colors_i = np.concatenate((np.linspace(0, 1., N), (0.,0.,0.,0.)))
colors_rgba = cmap(colors_i)
indices = np.linspace(0, 1., N+1)
cdict = {}
for ki,key in enumerate(('red','green','blue')):
cdict[key] = [ (indices[i], colors_rgba[i-1,ki], colors_rgba[i,ki])
for i in xrange(N+1) ]
# Return colormap object.
return mcolors.LinearSegmentedColormap(cmap.name + "_%d"%N, cdict, 1024)

fig, ax = plt.subplots()
A = np.random.random((10,10))*10
cmap = plt.get_cmap('YlGnBu')
ax.imshow(A, interpolation='nearest', cmap=cmap)
colorbar_index(ncolors=11, cmap=cmap)
plt.show()

enter image description here

关于python - 更正 matplotlib 颜色条刻度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18704353/

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