matplotlib 颜色条刻度标签格式
Posted
技术标签:
【中文标题】matplotlib 颜色条刻度标签格式【英文标题】:matplotlib colorbar tick label formatting 【发布时间】:2016-06-14 05:03:19 【问题描述】:我想知道如何在 matplotlib 中显式设置颜色条对象的格式
这是一个示例绘图脚本:
from matplotlib import pyplot
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
from matplotlib.colors import BoundaryNorm
from matplotlib.ticker import MaxNLocator
from pylab import *
import numpy as np
import random
# ----------
plot_aspect = 1.2
plot_height = 10.0
plot_width = int(plot_height*plot_aspect)
# ----------
pyplot.figure(figsize=(plot_width, plot_height), dpi=100)
pyplot.subplots_adjust(left=0.10, right=1.00, top=0.90, bottom=0.06, hspace=0.30)
subplot1 = pyplot.subplot(111)
# ----------
cbar_max = 40.0
cbar_min = 20.0
cbar_step = 1.0
cbar_num_colors = 200
cbar_num_format = "%d"
# ----------
# make random dataset
dx, dy = 5.0, 5.0
y, x = np.mgrid[slice(-100.0, 100.0 + dy, dy),slice(-100.0, 100.0 + dx, dx)]
z = []
for i in x:
z.append([])
for j in y:
z[-1].append(random.uniform(cbar_min,cbar_max))
# ----------
# make random dataset
levels = MaxNLocator(nbins=cbar_num_colors).tick_values(cbar_min, cbar_max)
cmap = pyplot.get_cmap('gist_ncar')
norm = BoundaryNorm(levels, ncolors=cmap.N, clip=True)
pp = pyplot.contourf(x,y,z,levels=levels,cmap=cmap)
cbar = pyplot.colorbar(pp, orientation='vertical', ticks=np.arange(cbar_min, cbar_max+cbar_step, cbar_step), format=cbar_num_format)
cbar.ax.set_ylabel('Color Scale [unit]', fontsize = 16, weight="bold")
CS = pyplot.contour(x,y,z, alpha=0.5)
majorLocator1 = MultipleLocator(10)
majorFormatter1 = FormatStrFormatter('%d')
minorLocator1 = MultipleLocator(5)
subplot1.xaxis.set_major_locator(majorLocator1)
subplot1.xaxis.set_major_formatter(majorFormatter1)
subplot1.xaxis.set_minor_locator(minorLocator1)
pyplot.xticks(fontsize = 16)
pyplot.xlim(-100.0,100.0)
majorLocator2 = MultipleLocator(10)
majorFormatter2 = FormatStrFormatter('%d')
minorLocator2 = MultipleLocator(5)
subplot1.yaxis.set_major_locator(majorLocator2)
subplot1.yaxis.set_major_formatter(majorFormatter2)
subplot1.yaxis.set_minor_locator(minorLocator2)
pyplot.yticks(fontsize = 16)
pyplot.ylim(-100.0,100.0)
subplot1.xaxis.grid()
subplot1.yaxis.grid()
subplot1.axes.set_aspect('equal')
pyplot.suptitle('Main Title', fontsize = 24, weight="bold")
pyplot.xlabel('X [unit]', fontsize=16, weight="bold")
pyplot.ylabel('Y [unit]', fontsize=16, weight="bold")
pyplot.show()
pyplot.close()
这给了我这样的输出:
目前颜色条刻度标签格式将使用前面提供的格式字符串:cbar_num_format = "%d"
,但我还想使用以下方法设置字体大小和粗细:
cbar.ax.set_yticklabels(np.arange(cbar_min, cbar_max+cbar_step, cbar_step), fontsize=16, weight='bold')
...但是当我这样做时,之前应用的格式化程序字符串似乎消失了,并且数字恢复为 "%0.1f"
格式,而不是我之前应用的 "%d"
:
如何防止这种情况发生或以更好的方式控制颜色条刻度标签?
【问题讨论】:
【参考方案1】:一种选择是手动格式化刻度标签。可能有更好的方法,但这通常对我有用。
cbar.ax.set_yticklabels([':.0f'.format(x) for x in np.arange(cbar_min, cbar_max+cbar_step, cbar_step)], fontsize=16, weight='bold')
编辑:
如果您不想自己计算刻度,可以使用:
for l in cbar.ax.yaxis.get_ticklabels():
l.set_weight("bold")
l.set_fontsize(16)
如果没有正确更新,您可能需要致电draw()
。这可以简化为一个衬里:
setp(cbar.ax.yaxis.get_ticklabels(), weight='bold', fontsize=16)
【讨论】:
[':.0f'.format(x) for x in ... 似乎不起作用,但是 [("%d" % x) for x in ...做!可能是版本不同? 可能是版本不同,你用的是什么python版本? 我使用的是 2.6.6 版【参考方案2】:这里我将颜色条刻度格式化为百分比。
import numpy as np
import matplotlib.pyplot as plt
xs = np.linspace(0, 1, 20)
ys = xs ** 3
colors = xs ** 2
scatter = plt.scatter(xs, ys, c=colors)
cb = plt.colorbar(scatter)
cb.ax.set_yticklabels([":.1%".format(i) for i in cb.get_ticks()]) # set ticks of your format
plt.show()
您也可以手动设置刻度位置。
ticks = np.linspace(0, 1, 5)
cb = plt.colorbar(scatter, ticks=ticks)
cb.ax.set_yticklabels([":.1%".format(i) for i in ticks]) # set ticks of your format
对于这个例子,我使用了python 3.7
、matplotlib 3.1.2
。
【讨论】:
【参考方案3】:更好的解决方案是
from matplotlib.ticker import FuncFormatter
fmt = lambda x, pos: ':.1%'.format(x)
cbar = plt.colorbar(format=FuncFormatter(fmt))
【讨论】:
看起来不需要在FuncFormatter
中换行。这有效:plt.colorbar(format=lambda x, _: f"x:.0%")
.【参考方案4】:
只是改成
cbar.ax.set_yticklabels(np.arange(int(cbar_min), int(cbar_max+cbar_step), int(cbar_step)), fontsize=16, weight='bold')
成功了!!!
即只需将int()
赋予np.arange()
内的cbar.ax.set_yticklabels
值
【讨论】:
确实有效,但我希望它灵活并且格式可以作为输入。不过谢谢!以上是关于matplotlib 颜色条刻度标签格式的主要内容,如果未能解决你的问题,请参考以下文章
matplotlib自定义设置plt.colorbar函数配置颜色条的刻度数实战:自定义设置颜色条刻度并为刻度值进行命名和标签化
Python / Matplotlib:带有contourf的颜色条不尊重自定义cmap的刻度标签