【问题标题】:Color a heatmap in Python/Matplotlib according to requirement根据要求在 Python/Matplotlib 中为热图着色
【发布时间】:2014-01-21 10:34:46
【问题描述】:

我正在尝试制作具有特定着色要求的热图。我想为数据设置一个间隔并判断为ok并将其着色为绿色,其余结果应着色为红色。有谁知道如何做到这一点? 为了更好地理解,我附上了一个使用 pandas 和 matplotlib 的简单示例。

import numpy as np 
from pandas import *
import matplotlib.pyplot as plt

Index= ['aaa', 'bbb', 'ccc', 'ddd', 'eee']
Cols = ['A', 'B', 'C', 'D']
data= abs(np.random.randn(5, 4))
df = DataFrame(data, index=Index, columns=Cols)

plt.pcolor(df)
plt.yticks(np.arange(0.5, len(df.index), 1), df.index)
plt.xticks(np.arange(0.5, len(df.columns), 1), df.columns)
plt.show()

【问题讨论】:

    标签: python matplotlib heatmap


    【解决方案1】:

    有不止一种方法可以做到这一点。

    最简单的方法是将布尔数组传递给pcolor,然后选择绿色为高红色为低的颜色图。

    例如:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    Index= ['aaa', 'bbb', 'ccc', 'ddd', 'eee']
    Cols = ['A', 'B', 'C', 'D']
    data= np.random.random((5, 4))
    df = pd.DataFrame(data, index=Index, columns=Cols)
    
    plt.pcolor(df > 0.5, cmap='RdYlGn')
    plt.yticks(np.arange(0.5, len(df.index), 1), df.index)
    plt.xticks(np.arange(0.5, len(df.columns), 1), df.columns)
    plt.show()
    

    或者,正如@Cyber​​ 所提到的,您可以根据您的值制作一个双色颜色图并使用它:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib.colors as mcolors
    
    Index= ['aaa', 'bbb', 'ccc', 'ddd', 'eee']
    Cols = ['A', 'B', 'C', 'D']
    data= np.random.random((5, 4))
    df = pd.DataFrame(data, index=Index, columns=Cols)
    
    # Values from 0-0.5 will be red and 0.5-1 will be green
    cmap, norm = mcolors.from_levels_and_colors([0, 0.5, 1], ['red', 'green'])
    
    plt.pcolor(df, cmap=cmap, norm=norm)
    plt.yticks(np.arange(0.5, len(df.index), 1), df.index)
    plt.xticks(np.arange(0.5, len(df.columns), 1), df.columns)
    plt.show()
    

    (颜色差异只是因为“RdYlGn”颜色图使用较深的绿色和红色作为其端点。)

    附带说明,使用pcolormeshpcolor 快得多。对于小型阵列,它不会产生显着差异,但对于大型阵列pcolor 太慢了。 imshow 甚至更快,如果您不介意光栅输出。使用imshow(data, interpolation='nearest', aspect='auto', origin='lower') 匹配pcolorpcolormesh 的默认值。

    【讨论】:

    • 旁注:matplotlib 可以仅从字符串推断颜色图。即plt.pcolor(df > 0.5, cmap='RdYlGn')。我猜可以节省一些打字时间。
    • @PaulH - 好点!谢谢!出于某种原因,我总是倾向于记住plt.get_cmap,但我忘记了这不是必需的。
    【解决方案2】:

    您可以制作2色colormap。 然后你可以在红色和绿色之间设置截止值。

    【讨论】:

    • 我是 matplotlib 的新手,你能给我看一个重用我的代码的例子吗?
    猜你喜欢
    • 2020-12-15
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 2018-01-02
    • 2020-05-17
    • 1970-01-01
    相关资源
    最近更新 更多