Python 如何在图像/矩阵中添加带有日志数据的颜色栏

Python 如何在图像/矩阵中添加带有日志数据的颜色栏,python,matplotlib,Python,Matplotlib,我想画一个二维矩阵。绘图本身是有效的,但我需要 带有它的色条。只有当数据被删除时,该图才有意义 原木转换。我希望颜色栏显示原始值。怎么 我要这样做吗 提供的搜索 但我不能让它工作 下面的代码给出了我尝试做什么的想法。只有复仇者 包括行(据我所知) 感谢您提供的任何帮助我们的想法不是转换数据,而是让可视化为您提供帮助 imshow[]有一个可选参数norm,可以为您进行日志转换 my_speed=np.ones(shape=(no,no)) fig = plt.figure(2) ax = fi

我想画一个二维矩阵。绘图本身是有效的,但我需要 带有它的色条。只有当数据被删除时,该图才有意义 原木转换。我希望颜色栏显示原始值。怎么 我要这样做吗

提供的搜索 但我不能让它工作

下面的代码给出了我尝试做什么的想法。只有复仇者 包括行(据我所知)


感谢您提供的任何帮助

我们的想法不是转换数据,而是让可视化为您提供帮助

imshow[]有一个可选参数
norm
,可以为您进行日志转换

my_speed=np.ones(shape=(no,no))

fig = plt.figure(2)
ax = fig.add_subplot(1,1,1)

# my_speed=np.log10(my_speed)
img = ax.imshow(my_speed, interpolation='bilinear', cmap=cm.jet,
                norm=mpl.colors.LogNorm())
fig.colorbar(img)

据我所知,您的代码有两个问题

首先,您试图让颜色栏上的记号显示原始值。为此,不应转换数据,而应规范化绘图

第二,您使用的是
ax.imshow
,这就是
颜色栏无法看到它的原因。您应该使用
plt.imshow
或使用
im=ax.imshow
然后使用
colorbar(im)

以下是一个可行的解决方案:

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

my_speed = np.random.rand(20, 20)

fig = plt.figure(2)
ax = fig.add_subplot(1, 1, 1)

im = ax.imshow(my_speed, interpolation='bilinear',
               norm=mpl.colors.LogNorm(),
               cmap=plt.cm.jet)
cb = plt.colorbar(im, orientation='vertical')

plt.show()

谢谢你的回复。我已经试过了,应该提到这一点。它引发了一个错误:`raise RUNTIMERROR('找不到可用于colorbar的可映射文件'运行时错误:找不到可用于colorbar创建的可映射文件。请首先定义一个可映射文件,例如图像(使用imshow)或轮廓集(使用contourf)。`I缺少一些内容。(很抱歉布局不好,我不太理解这个工具)抱歉,我应该提到,您可能应该使用
np.one
而不是
np.zero
来尝试您的示例,因为使用0的日志不是一件好事:)我已经在代码中以另一种方式修复了此问题。我将更新示例。是的!img部分是需要的。非常感谢。出现了一个新问题:因为我从np.one开始,所以颜色栏中的最低值是10E0。我将值添加到此基础值。但在结果中,这应解释为0。有没有优雅的方法来解决这个问题?值1表示一个很好的黑色,但如何使其在刻度上很好地表示?对不起,我不确定是否理解您的问题。首先为什么要进行日志转换?日志转换的问题是,在计数矩阵中不应该有零。如果您有,您可以使用伪计数(从您显然使用的伪计数开始)。如果要在[0,oo]之间绘制值[,您可以尝试
matplotlib.colors.PowerNorm
标准化,它随
matplotlib-1.4.x
一起提供。这样,如果这是您的目标,您可以强调低值。我不知道您的用例,因此很难给出好的建议。谢谢您的回复。我的数字范围为0-10E4。低值很重要,所以lognormal确实给出了一个很好的表示。唯一的问题是颜色条从1开始,而不是0,在我的例子中,0是一个重要的值。因此,当人们研究时,他们会惊讶地发现没有0值区域。如果大数字的具体大小无关紧要,并且知道它们很大就足够了,那么你可能有一个perfect PowerNorm规范化的用例。不幸的是,它还没有发布,但如果您从安装matplotlib-1.4.0-r1,您可以尝试。我不知道如何破解颜色条缩放,您可能必须用谷歌搜索或问另一个问题。但是,如果可以的话,我会尽量避免。对不起,我刚刚再次测试了,您应该这样做即使矩阵中有零,也要能够使用LogNorm。仅用零绘制矩阵似乎不适用于imshow。
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

my_speed = np.random.rand(20, 20)

fig = plt.figure(2)
ax = fig.add_subplot(1, 1, 1)

im = ax.imshow(my_speed, interpolation='bilinear',
               norm=mpl.colors.LogNorm(),
               cmap=plt.cm.jet)
cb = plt.colorbar(im, orientation='vertical')

plt.show()