【问题标题】:In Matplotlib's imshow, can I enforce symmetric color limits without specifying the range?在 Matplotlib 的 imshow 中,我可以在不指定范围的情况下强制执行对称颜色限制吗?
【发布时间】:2018-04-27 07:36:16
【问题描述】:

我想绘制具有对称颜色限制的差异图像,而不必自己计算颜色限制。也就是说,我的图像的强度可能在[-3, 5] 范围内。默认情况下,imshow 使用这些值作为颜色限制,并且使用发散的颜色图,白色中心为 1。原因是我以后可能会更改图像并希望避免自己重新计算颜色限制在每个动画步骤中。

我能否让imshow 强制使用居中颜色限制,在我的示例中为[-5, 5],而我自己却不通过[-5, 5]

【问题讨论】:

  • 我想我不明白这一点。颜色映射需要一些限制才能知道应该为哪个值选择哪种颜色。所以假设第一个图的颜色限制是 [-5,5] (无论是因为你设置了它,还是因为它是在内部设置的,都没有关系)。现在下一个情节被生成。那个期望的限制是什么?会是 [-5,5] 因为第一个情节有这些吗?还是说是 [-10,10] 因为这对数据有意义?但如果是这样,第一个情节怎么会知道使用 [-10,10]?

标签: matplotlib colors


【解决方案1】:

我假设您的意思是您不想手动计算每个图的限制,但可以在更改图时更新限制。

在这种情况下,您需要计算出哪个限制是更高的绝对数,然后将其负数传递给vmin,将数字本身传递给imshow 中的vmax 关键字。这是一个最小的例子

import numpy as np
import matplotlib.pyplot as plt

data = np.zeros((10, 10))
for i in range(10):
    data[i] = np.linspace(-3, 5, 10)

def plot(data):
    limit = max(abs(np.min(data)), abs(np.max(data)) )

    plt.imshow(data, aspect='auto', cmap='RdBu',
              vmin=-limit, vmax=limit)
    plt.colorbar()
    plt.show()

【讨论】:

  • 是的,您假设是正确的:1. 我“不想手动计算每个图的限制”,2. 我想“随着我改变图而更新限制”。但据我所知,您的代码两者都没有: 1. 它手动计算限制。 2. 数据更改时不更新限制(也可以看到,在imshow 行添加.set_array(10 * np.ones_like(data)))。
  • 顺便说一句,您的示例缺少 import matplotlib.pyplot as plt, numpy as np 工作。
  • @bers,我更新了导入并将绘图转换为一个函数,它应该可以按您的意愿工作,但也许您的问题是这是否可以通过 imshow 中的某些功能强制执行?我不认为有办法做到这一点,但也许我错了
  • 是的,那是我的问题。我不想计算limits
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多