如何添加Matplotlib颜色条刻度

27

在stackoverflow上有很多关于matplotlib colorbar的问题,但我无法理解它们以解决我的问题。

如何设置colorbar的yticklabels?

以下是一些示例代码:

from pylab import *
from matplotlib.colors import LogNorm
import matplotlib.pyplot as plt

f = np.arange(0,101)                 # frequency 
t = np.arange(11,245)                # time
z = 20*np.sin(f**0.56)+22            # function
z = np.reshape(z,(1,max(f.shape)))   # reshape the function
Z = z*np.ones((max(t.shape),1))      # make the single vector to a mxn matrix
T, F = meshgrid(f,t)
fig = plt.figure()
ax = fig.add_subplot(111)
plt.pcolor(F,T,Z, norm=LogNorm(vmin=z.min(),vmax=z.max()))
plt.xlim((t.min(),t.max()))
mn=int(np.floor(Z.min()))        # colorbar min value
mx=int(np.ceil(Z.max()))         # colorbar max value
md=(mx-mn)/2                     # colorbar midpoint value
cbar=plt.colorbar()              # the mystery step ???????????
cbar.set_yticklabels([mn,md,mx]) # add the labels
plt.show()

我正在使用带有PyDev的Eclipse,有时我只是将代码粘贴到Python命令行中。我不太确定你在建议什么,但我会研究一下,因为听起来很有帮助。 - sequoia
谢谢,以后查看可用方法的好提示。 - sequoia
6个回答

58

更新刻度和刻度标签:

cbar.set_ticks([mn,md,mx])
cbar.set_ticklabels([mn,md,mx])

3
为什么我的 mx 刻度是唯一一个没有在色条上可视化的?这是怎么发生的? - FaCoffee
1
@FaCoffee 你需要将 mn, md, mx 的刻度映射到0到1之间的区间,以便显示所有刻度标签。 - Alexander

10

一个具有五个刻度条的工作示例(适用于任何值范围)是:

m0=int(np.floor(field.min()))            # colorbar min value
m4=int(np.ceil(field.max()))             # colorbar max value
m1=int(1*(m4-m0)/4.0 + m0)               # colorbar mid value 1
m2=int(2*(m4-m0)/4.0 + m0)               # colorbar mid value 2
m3=int(3*(m4-m0)/4.0 + m0)               # colorbar mid value 3
cbar.set_ticks([m0,m1,m2,m3,m4])
cbar.set_ticklabels([m0,m1,m2,m3,m4])

1

treenick的回答帮助我入门了,但如果你的色条在0到1之间缩放,那么如果你的fields没有在0到1之间缩放,该代码将不会绘制刻度。所以我使用了以下代码:

m0=int(np.floor(field.min()))            # colorbar min value
m4=int(np.ceil(field.max()))             # colorbar max value
num_ticks = 10
# to get ticks
ticks = np.linspace(0, 1, num_ticks)
# get labels
labels = np.linspace(m0, m1, num_ticks)

如果您想要有间隔的标签,可以像这样使用Python列表索引:假设跳过每个其他刻度。
ticks = ticks[::2]
labels = labels[::2]

这通常会给出带有奇怪数字的数字,例如0.12349956。 - Jason

1

这个会起作用

from pylab import *
from matplotlib.colors import LogNorm
import matplotlib.pyplot as plt

f = np.arange(0,101)                 # frequency 
t = np.arange(11,245)                # time
z = 20*np.sin(f**0.56)+22            # function
z = np.reshape(z,(1,max(f.shape)))   # reshape the function
Z = z*np.ones((max(t.shape),1))      # make the single vector to a mxn matrix
T, F = meshgrid(f,t)
fig = plt.figure()
ax = fig.add_subplot(111)
plt.pcolor(F,T,Z, norm=LogNorm(vmin=z.min(),vmax=z.max()))
plt.xlim((t.min(),t.max()))
v1 = np.linspace(Z.min(), Z.max(), 8, endpoint=True)
cbar=plt.colorbar(ticks=v1)              # the mystery step ???????????
cbar.ax.set_yticklabels(["{:4.2f}".format(i) for i in v1]) # add the labels
plt.show()

1
欢迎来到StackOverflow。虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并指出适用的限制和假设。 - Ruli

1
你可以尝试类似这样的内容。
from pylab import *
from matplotlib.colors import LogNorm
import matplotlib.pyplot as plt

f = np.arange(0,101)                 # frequency 
t = np.arange(11,245)                # time
z = 20*np.sin(f**0.56)+22            # function
z = np.reshape(z,(1,max(f.shape)))   # reshape the function
Z = z*np.ones((max(t.shape),1))      # make the single vector to a mxn matrix
T, F = meshgrid(f,t)
fig = plt.figure()
ax = fig.add_subplot(111)
plt.pcolor(F,T,Z, norm=LogNorm(vmin=z.min(),vmax=z.max()))
plt.xlim((t.min(),t.max()))
v1 = np.linspace(Z.min(), Z.max(), 8, endpoint=True)
cbar=plt.colorbar(ticks=v1)              # the mystery step ???????????
cbar.ax.set_yticklabels(["{:4.2f}".format(i) for i in v1]) # add the labels
plt.show()

enter image description here


0

根据 Eryk Sun 的回答,仅使用:

cbar.set_ticks([mn,md,mx])
cbar.set_ticklabels([mn,md,mx])

将刻度 mnmdmx 映射到 0 到 1 的区间。例如,如果变量 mn,md,mx 的值是 0,1,2,那么只会显示 mnmd

相反地,先定义刻度标签,然后再将色条刻度映射在 0 到 1 之间:

import numpy as np

ticklabels = ['a', 'b', 'c', 'd']
cbar.set_ticks(np.linspace(0, 1, len(ticklabels)))
cbar.set_ticklabels(ticklabels)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接