要使用matplotlib颜色条,必须使用matplotlib.cm.ScalarMappable
的子类中的对象指定matplotlib.colors.Normalize
,colorbar
可以从中知道如何将数据规范化为[0, 1]浮动值。
matplotlib,线性归一化,日志,幂律等提供的归一化过程很少,但在实践中,我们可能想要使用自己编写的其他归一化函数。
我们可以使用任何函数将数据数组规范化为[0,1],但如果没有Scalarmappable
使用Nomalization
子类构建,则颜色条不会有正确的标记和标签。
我想知道我对matplotlib colorbar的理解是对吗还是有其他方法可以很容易地做到这一点?或者我们必须手动编写一个子类来包装自定义规范化函数?
答案 0 :(得分:1)
为此,您可以轻松地将matplotlib.colors.Normalize
子类化。这是我为previous SO question编写的分段规范化类的示例:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
class PiecewiseNorm(Normalize):
def __init__(self, levels, clip=False):
# input levels
self._levels = np.sort(levels)
# corresponding normalized values between 0 and 1
self._normed = np.linspace(0, 1, len(levels))
Normalize.__init__(self, None, None, clip)
def __call__(self, value, clip=None):
# linearly interpolate to get the normalized value
return np.ma.masked_array(np.interp(value, self._levels, self._normed))
def inverse(self, value):
return 1.0 - self.__call__(value)
例如:
y, x = np.mgrid[0.0:3.0:100j, 0.0:5.0:100j]
H = 50.0 * np.exp( -(x**2 + y**2) / 4.0 )
levels = [0, 1, 2, 3, 6, 9, 20, 50]
H1 = -50.0 * np.exp( -(x**2 + y**2) / 4.0 )
levels1 = [-50, -20, -9, -6, -3, -2, -1, 0]
fig, ax = plt.subplots(2, 2, gridspec_kw={'width_ratios':(20, 1), 'wspace':0.05})
im0 = ax[0, 0].contourf(x, y, H, levels, cmap='jet', norm=PiecewiseNorm(levels))
cb0 = fig.colorbar(im0, cax=ax[0, 1])
im1 = ax[1, 0].contourf(x, y, H1, levels1, cmap='jet', norm=PiecewiseNorm(levels1))
cb1 = fig.colorbar(im1, cax=ax[1, 1])
plt.show()
答案 1 :(得分:0)
感谢@ali_m的想法,几天之后我想我想到了用任何规范化函数 keep <- function(x, name) {assign(as.character(substitute(name)), x, pos = 1)}
iris %>%
ddply(.(Species), summarise,
mean.petal = mean(Petal.Length),
mean.sepal = mean(Sepal.Length)) %>% keep(unsorted.data) %>% # keep this step
arrange(mean.petal) %>%
{.} -> sorted.data
sorted.data
# Species mean.petal mean.sepal
#1 setosa 1.462 5.006
#2 versicolor 4.260 5.936
#3 virginica 5.552 6.588
unsorted.data
# Species mean.petal mean.sepal
#1 setosa 1.462 5.006
#2 versicolor 4.260 5.936
#3 virginica 5.552 6.588
定义自定义Normalization
子类。基本上用任何y=func(x)
给出的规范化值替换私有成员self._normed
。在初始化子类时,必须将函数钩子赋予规范化函数func(self._levels)
。但请确保func
必须是真正的规范化。
以下代码的灵感来自@ali_m的答案:
func