颜色条刻度格式化无效。

3
我有以下代码,它生成一个带有颜色条的散点图:
#!/usr/bin/env python3
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
from matplotlib.ticker import *
import matplotlib.ticker as ticker
import matplotlib as mpl
import matplotlib.gridspec as gridspec
from list2nparr import list2nparr

# this part changes the fonts for latex handling
plt.rcParams['text.latex.preamble']=[r"\usepackage{lmodern}"]
plt.rcParams['text.usetex'] = True
plt.rcParams['font.family'] = 'lmodern'
plt.rcParams['font.size'] = 16
#==================================================================
fig,ax1 = plt.subplots()
data = list2nparr('radiant.txt')
lm  = data[:,14]
bet = data[:,15]
b   = data[:,18]
#
cm = plt.cm.get_cmap('jet')
sc2 = ax1.scatter(lm, bet, c=b, s=10, cmap=cm, edgecolor='none',rasterized=True)
# ==========================COLORBAR SPECS=========================
cb3 = fig.colorbar(sc2,ax = ax1, aspect=10)
cb3.ax.tick_params(labelsize=16)
cb3.set_label(r'$\beta = F_R/F_G$',size=18,labelpad=20)
cb3.formatter.set_powerlimits((0, 0))
cb3.ax.yaxis.set_major_locator(MaxNLocator(5,prune='upper')) # WHY DOES THIS LINE NOT WORK?
cb3.update_ticks()

# =======================SCATTER PLOT SPECS========================
ax1.set_ylabel('$b$, (deg)',fontsize=18,labelpad=0.5)
ax1.set_xlabel("$\lambda-\lambda_{\odot}$, (deg)",fontsize=18)
plt.savefig('test.eps', format='eps')

在某个时刻,我试图格式化颜色条的刻度,请求仅使用五个刻度,同时删除最上面的标签。这在第30行中有所说明,其中写着:cb3.ax.yaxis.set_major_locator(MaxNLocator(5,prune='upper')) 然而,这一行似乎对图表没有任何影响?有什么想法是可能的原因吗?

enter image description here

enter image description here

1个回答

1

编辑

在创建色条时,请使用定位器:

cb3 = fig.colorbar(sc2,ax = ax1, aspect=10, ticks=MaxNLocator(5))

并删除此行:

cb3.ax.yaxis.set_major_locator(MaxNLocator(5,prune='upper'))

旧答案

将这两行的顺序翻转:

cb3.update_ticks()
cb3.ax.yaxis.set_major_locator(MaxNLocator(5,prune='upper'))

你应该只使用五个颜色间隔。
或者,完全不使用set_major_locator,在实例化时直接设置刻度:
cb3 = fig.colorbar(sc2,ax = ax1, aspect=10, ticks=[0, 2.5e-4, 5e-4, 7.5e-4, 1e-3 ])

它似乎可以工作,但它破坏了误差条的范围,因此并没有解决问题。最初我的误差条范围从0.0到-2.25,但现在它似乎从0.0到1.25运行。我希望有一种方法可以展示这两个图像,这样你就可以比较它们。 - user3578925
您可以在问题中添加图片。只需点击看起来像图片的图标,然后拖放即可。 - Mike Müller
抱歉,我对 Stack Overflow 还比较新,不知道图片图标在哪里。我看不到它? - user3578925
我已经将这两张图片上传到我的原始问题中。第一张图片是在建议在调用格式化程序之前放置cb3.update_ticks()后的结果,而第二张图片是原始图片。显然,第一张图片中的范围已被破坏。 - user3578925
建议的替代方案在我禁用MaxNLocator时有效。然而,我展示的代码片段是一个更大的工具包的一部分。我无法事先知道色条的确切值(它们不是常数)。因此,如果matplotlib可以根据我的数据选择5个bin,那就太好了。因此,这个替代方案对我来说并不是正确的解决方案。 - user3578925
显示剩余4条评论

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