我正在试着做一个有特定颜色要求的热图。我想为数据设置一个间隔,并判断为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
是非常慢的。imshow
甚至更快,如果你不介意光栅输出的话。使用imshow(data, interpolation='nearest', aspect='auto', origin='lower')
匹配pcolor
和pcolormesh
的默认值。关于python - 根据要求在Python/Matplotlib中为热图着色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20909035/