我想用一个数据帧传递给下面函数的值来注释热图.我查看了matplotlib.text但是无法在我的热图中以所需的方式从我的数据框中获取值.我已经粘贴了我的函数,用于生成下面的热图,之后是我的数据帧和热图调用的输出.我想从热图中每个单元格中心的数据框中绘制每个值.
生成热图的功能:
import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.colors as mcolors def heatmap_binary(df, edgecolors='w', #cmap=mpl.cm.RdYlGn, log=False): width = len(df.columns)/7*10 height = len(df.index)/7*10 fig, ax = plt.subplots(figsize=(20,10))#(figsize=(width,height)) cmap, norm = mcolors.from_levels_and_colors([0, 0.05, 1],['Teal', 'MidnightBlue'] ) # ['MidnightBlue', Teal]['Darkgreen', 'Darkred'] heatmap = ax.pcolor(df , edgecolors=edgecolors, # put white lines between squares in heatmap cmap=cmap, norm=norm) ax.autoscale(tight=True) # get rid of whitespace in margins of heatmap ax.set_aspect('equal') # ensure heatmap cells are square ax.xaxis.set_ticks_position('top') # put column labels at the top ax.tick_params(bottom='off', top='off', left='off', right='off') # turn off ticks plt.yticks(np.arange(len(df.index)) + 0.5, df.index, size=20) plt.xticks(np.arange(len(df.columns)) + 0.5, df.columns, rotation=90, size= 15) # ugliness from http://matplotlib.org/users/tight_layout_guide.html from mpl_toolkits.axes_grid1 import make_axes_locatable divider = make_axes_locatable(ax) cax = divider.append_axes("right", "3%", pad="1%") plt.colorbar(heatmap, cax=cax) plt.show()
Herre是My dataframe的一个例子:
dataframe : 0-5 km / h 5-40 km / h 40-80 km / h 80-120 km / h \ NORDIC 0.113955 0.191888 0.017485 -0.277528 MIDDLE EU 0.117903 0.197084 -0.001447 -0.332677 KOREA 0.314008 0.236503 -0.067174 -0.396518 CHINA 0.314008 0.236503 -0.067174 -0.396518 120-160 km / h 160-190 km / h 190 km / h NORDIC -0.054365 0.006107 0.002458 MIDDLE EU 0.002441 0.012097 0.004599 KOREA -0.087191 0.000331 0.000040 CHINA -0.087191 0.000331 0.000040
生成热图:
heatmap_binary(dataframe)
有任何想法吗?
更新以澄清我的问题
我尝试了问题的建议解决方案,其中包含我正在寻找的结果: 如何在matplotlib中使用文本注释热图? 但是,我仍然有一个问题,使用matplotlib.text函数来定位热图中的值:这是我尝试此解决方案的鳕鱼:
import matplotlib.pyplot as plt import numpy as np data = dataframe.values heatmap_binary(dataframe) for y in range(data.shape[0]): for x in range(data.shape[1]): plt.text(data[y,x] +0.05 , data[y,x] + 0.05, '%.4f' % data[y, x], #data[y,x] +0.05 , data[y,x] + 0.05 horizontalalignment='center', verticalalignment='center', color='w') #plt.colorbar(heatmap) plt.show()
添加情节:(不同颜色,但相同的问题)
此功能由seaborn包提供.它可以生成像这样的地图
seaborn的一个例子是
import seaborn as sns sns.set() # Load the example flights dataset and conver to long-form flights_long = sns.load_dataset("flights") flights = flights_long.pivot("month", "year", "passengers") # Draw a heatmap with the numeric values in each cell sns.heatmap(flights, annot=True, fmt="d", linewidths=.5)
您在for
循环中用于坐标的值被搞砸了.你也使用的是plt.colorbar
代替更清洁的东西fig.colorbar
.试试这个(它完成了工作,没有努力以其他方式清理代码):
def heatmap_binary(df, edgecolors='w', #cmap=mpl.cm.RdYlGn, log=False): width = len(df.columns)/7*10 height = len(df.index)/7*10 fig, ax = plt.subplots(figsize=(20,10))#(figsize=(width,height)) cmap, norm = mcolors.from_levels_and_colors([0, 0.05, 1],['Teal', 'MidnightBlue'] ) # ['MidnightBlue', Teal]['Darkgreen', 'Darkred'] heatmap = ax.pcolor(df , edgecolors=edgecolors, # put white lines between squares in heatmap cmap=cmap, norm=norm) data = df.values for y in range(data.shape[0]): for x in range(data.shape[1]): plt.text(x + 0.5 , y + 0.5, '%.4f' % data[y, x], #data[y,x] +0.05 , data[y,x] + 0.05 horizontalalignment='center', verticalalignment='center', color='w') ax.autoscale(tight=True) # get rid of whitespace in margins of heatmap ax.set_aspect('equal') # ensure heatmap cells are square ax.xaxis.set_ticks_position('top') # put column labels at the top ax.tick_params(bottom='off', top='off', left='off', right='off') # turn off ticks ax.set_yticks(np.arange(len(df.index)) + 0.5) ax.set_yticklabels(df.index, size=20) ax.set_xticks(np.arange(len(df.columns)) + 0.5) ax.set_xticklabels(df.columns, rotation=90, size= 15) # ugliness from http://matplotlib.org/users/tight_layout_guide.html from mpl_toolkits.axes_grid1 import make_axes_locatable divider = make_axes_locatable(ax) cax = divider.append_axes("right", "3%", pad="1%") fig.colorbar(heatmap, cax=cax)
然后
df1 = pd.DataFrame(np.random.choice([0, 0.75], size=(4,5)), columns=list('ABCDE'), index=list('WXYZ')) heatmap_binary(df1)
得到: