我想使用从数据框传递到下面函数的值来注释热图。我查看了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)
有什么想法吗?
更新以澄清我的问题
我从问题中尝试了提出的解决方案,其中包含我正在寻找的结果: how to annotate heatmap with text in 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()
添加情节:(不同颜色,但同样的问题)
答案 0 :(得分:7)
您在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)
给出:
答案 1 :(得分:5)
此功能由seaborn包提供。它可以生成像
这样的地图seaborn的示例用法是
var spclChar=/^[<>]$/;
if(searchCriteria.firstName.match(spclChar)){
return true;
}else {
return false;
}
答案 2 :(得分:1)
这是因为您在添加其他轴后使用plt.text
。
状态机将在当前轴上绘图,在您添加divider.append_axes
的新轴后,颜色条的轴是当前轴。 (只是调用plt.colorbar
不会导致这种情况,因为如果它自己创建了轴,它会将当前轴设置回原来的轴。如果使用cax
kwarg传入特定的轴对象,它不会重置“当前”轴,因为这不是您通常想要的。)
这样的事情是你会看到这么多人建议你使用OO接口到matplotlib而不是状态机界面的主要原因。这样你就可以知道你正在绘制哪些轴对象。
例如,在您的情况下,您可以让heatmap_binary
返回它创建的ax
对象,使用ax.text
而不是plt.text
返回图表(类似于其他绘图方法)。
答案 3 :(得分:0)
您还可以使用 plotly.figure_factory 从DataFrame中创建热图 ,但是您已经转换了它到列表中 >。
import plotly.figure_factory as ff
z = [your_dataframe].values.tolist()
x = [your_dataframe].columns.tolist()
y = [your_dataframe].index.tolist()
fig = ff.create_annotated_heatmap(z, x=x, y=y, annotation_text=z, colorscale='viridis')
# for add annotation into Heatmap
for i in range(len(fig.layout.annotations)):
fig.layout.annotations[i].font.size = 12
# show your Heatmap
fig.show()