根据需要在Python/Matplotlib中为热图着色

根据需要在Python/Matplotlib中为热图着色,python,matplotlib,heatmap,Python,Matplotlib,Heatmap,我正试着制作一张有特定着色要求的热图。我想为数据设置一个间隔,并判断为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']

我正试着制作一张有特定着色要求的热图。我想为数据设置一个间隔,并判断为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()

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

有多种方法可以做到这一点

最简单的方法是将布尔数组传递到
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”颜色贴图使用较深的绿色和红色作为其端点。)


另一方面,使用
pcolormesh
比使用
pcolor
更快。对于小型阵列,这不会产生显著差异,但对于大型阵列,
pcolor
的速度非常慢<如果您不介意光栅输出的话,code>imshow甚至更快。使用
imshow(data,interpolation='nearest',aspect='auto',origin='lower')
来匹配
pcolor
pcolormesh
的默认值。我是matplotlib的新手,你能给我举一个重用代码的例子吗?旁注:matplotlib可以仅从字符串推断颜色映射。i、 例如,
plt.pcolor(df>0.5,cmap='RdYlGn')
。我想这可以节省一些打字时间。@PaulH-说得好!谢谢出于某种原因,我总是倾向于记住plt.get_cmap,但我忘记了这是不必要的。