python - 来自自定义 cmap 的 Proplot 颜色条
问题描述
我想从Colormap
对象而不是使用可映射对象(例如从imshow
.
从文档中我认为这应该可以使用选项 4。
我正在使用以下代码:
import numpy as np
import proplot as pplt
import matplotlib as mpl
x = np.linspace(0, 2*np.pi, endpoint=True, num=20)
y = 100*np.sin(x)
cmap = mpl.cm.get_cmap('jet')
norm = mpl.colors.Normalize(vmin=-100, vmax=100)
colors = cmap(norm(y))
fig, ax = pplt.subplots()
ax.scatter(x, y, c=colors)
fig.colorbar(cmap, values=np.linspace(-100, 100, endpoint=True, num=100))
这给出了以下结果:
这几乎是我想要的,但我想将条形值的颜色范围从 -100 到 100,我认为values
参数会这样做。如果我看一下代码,它似乎values
被忽略了np.linspace(0, 1)
我试过这个:
num = 1000
values = np.linspace(-100, 100, num=num, endpoint=True)
colors_cont = cmap(norm(values))
cbar = fig.colorbar(colors_cont, values=values, ticks=[-100, 0, 100],
boundaries=np.linspace(-100, 100, num=num, endpoint=True))
这或多或少有效,但我更愿意将 cmap 交给 proplot 并让它发挥它的魔力。
ScalarMappable
根据这篇文章使用 a不适用于 proplot:
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
cbar = fig.colorbar(sm)
解决方案
编辑:更好的方法是也传递Normalize
到颜色条。这也允许使用locator
:
cmap = pplt.Colormap(cmap)
ymin, ymax = ax.get_ylim()
locator = pplt.Locator('linear', 5)
ax.colorbar(cmap, norm=norm, locator=locator)
通过设置刻度然后覆盖标签的原始答案:
ticks = pplt.arange(0, 1, 0.25)
labels = np.linspace(-100, 100, num=5, endpoint=True)
cbar = fig.colorbar(cmap, ticks=ticks)
cbar.ax.set_yticklabels(labels)
推荐阅读
- oracle - 在 oracle 中更改对象类型后,哪些元数据表将提供正确数量的属性
- google-sheets - 使用 Sumifs,其中一个范围可以匹配多个条件
- r - 计算每年平均单圈时间的有效方法
- maven - 想知道为什么管道失败
- python - 在 pyspark 上初始化 SparkSession 时出错
- graphviz - 图和子图布局
- python - 如何组织 OOP 字符串输出
- mongodb - Mongodb Aggregate - 如何通过 multilpe 数组索引过滤数组?
- github - 从 Github 到 Azure DevOps 时,有什么方法可以保持远程连接?
- python - 从字符串中间剥离字符