栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python:从matplotlib热图及其图例中保留Numpy NaN值

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python:从matplotlib热图及其图例中保留Numpy NaN值

所述

nans
干扰
pcolor
确定包含在值的范围
data
,因为

In [72]: data.min(), data.max()Out[72]: (nan, nan)

您可以通过声明自己使用的值范围来解决此问题,

np.nanmin
np.nanmax
在以下位置找到最小和最大的非NaN值
data

heatmap = ax.pcolor(data, cmap=plt.cm.seismic,          vmin=np.nanmin(data), vmax=np.nanmax(data))

以来

In [73]: np.nanmin(data), np.nanmax(data)Out[73]: (0.025462800000000001, 0.97094435999999995)

import numpy as npimport matplotlib.pyplot as pltcolumn_labels = list('ABCDEFGH')row_labels = list('WXYZ')fig, ax = plt.subplots()data = np.array([[ 0.96753494,  0.52349944,  0.0254628 ,  0.5104103 ],         [ 0.07320069,  0.91278731,  0.97094436,  0.70533351],         [ 0.30162006,  0.49068337,  0.41837729,  0.71139215],         [ 0.19786101,  0.15882713,  0.59028841,  0.06242765],         [ 0.51505872,  0.07798389,  0.58790067,  0.44782683],         [ 0.68975694,  0.53535385,  0.15696023,  0.35641951],         [ 0.66481995,  0.03576846,  0.9623601 ,  0.96006395],         [ 0.45865404,  0.50433582,  0.18182575,  0.35126449],])data[3,:] = np.nanheatmap = ax.pcolor(data, cmap=plt.cm.seismic,          vmin=np.nanmin(data), vmax=np.nanmax(data))heatmap.cmap.set_under('black')bar = fig.colorbar(heatmap, extend='both')# put the major ticks at the middle of each cellax.set_xticks(np.arange(data.shape[1])+0.5, minor=False)ax.set_yticks(np.arange(data.shape[0])+0.5, minor=False)# want a more natural, table-like displayax.invert_yaxis()ax.xaxis.tick_top()ax.set_xticklabels(row_labels, minor=False)ax.set_yticklabels(column_labels, minor=False)plt.show()


另一个选择基于JoeKington的解决方案是在

data
NaN处绘制带有阴影线的矩形补丁。

上面的示例显示,

pcolor
具有NaN值的单元格中的颜色好像NaN都是非常负的数字。相反,如果你传递
pcolor
一个 蒙面阵列
pcolor
叶蒙版区域透明。因此,您可以在轴背景色块上绘制阴影
ax.patch
,以在被遮罩的区域上显示阴影。

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.patches as mpatchescolumn_labels = list('ABCDEFGH')row_labels = list('WXYZ')fig, ax = plt.subplots()data = np.array([[ 0.96753494,  0.52349944,  0.0254628 ,  0.5104103 ],         [ 0.07320069,  0.91278731,  0.97094436,  0.70533351],         [ 0.30162006,  0.49068337,  0.41837729,  0.71139215],         [ 0.19786101,  0.15882713,  0.59028841,  0.06242765],         [ 0.51505872,  0.07798389,  0.58790067,  0.44782683],         [ 0.68975694,  0.53535385,  0.15696023,  0.35641951],         [ 0.66481995,  0.03576846,  0.9623601 ,  0.96006395],         [ 0.45865404,  0.50433582,  0.18182575,  0.35126449],])data[3,:] = np.nandata = np.ma.masked_invalid(data)heatmap = ax.pcolor(data, cmap=plt.cm.seismic,          vmin=np.nanmin(data), vmax=np.nanmax(data))# https://stackoverflow.com/a/16125413/190597 (Joe Kington)ax.patch.set(hatch='x', edgecolor='black')fig.colorbar(heatmap)# put the major ticks at the middle of each cellax.set_xticks(np.arange(data.shape[1])+0.5, minor=False)ax.set_yticks(np.arange(data.shape[0])+0.5, minor=False)# want a more natural, table-like displayax.invert_yaxis()ax.xaxis.tick_top()ax.set_xticklabels(row_labels, minor=False)ax.set_yticklabels(column_labels, minor=False)plt.show()

如果您希望使用多种阴影线标记,例如对NaN说一种,对负值说另一种,那么您可以使用循环来添加阴影阴影的矩形:

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.patches as mpatchescolumn_labels = list('ABCDEFGH')row_labels = list('WXYZ')fig, ax = plt.subplots()data = np.array([[ 0.96753494,  0.52349944,  0.0254628 ,  0.5104103 ],         [ 0.07320069,  0.91278731,  0.97094436,  0.70533351],         [ 0.30162006,  0.49068337,  0.41837729,  0.71139215],         [ 0.19786101,  0.15882713,  0.59028841,  0.06242765],         [ 0.51505872,  0.07798389,  0.58790067,  0.44782683],         [ 0.68975694,  0.53535385,  0.15696023,  0.35641951],         [ 0.66481995,  0.03576846,  0.9623601 ,  0.96006395],         [ 0.45865404,  0.50433582,  0.18182575,  0.35126449],])data -= 0.5data[3,:] = np.nandata = np.ma.masked_invalid(data)heatmap = ax.pcolor(data, cmap=plt.cm.seismic,          vmin=np.nanmin(data), vmax=np.nanmax(data))# https://stackoverflow.com/a/16125413/190597 (Joe Kington)ax.patch.set(hatch='x', edgecolor='black')# draw a hatched rectangle wherever the data is negative# http://matthiaseisen.com/pp/patterns/p0203/mask = data < 0for j, i in np.column_stack(np.where(mask)):      ax.add_patch(          mpatches.Rectangle(   (i, j),     # (x,y)   1,          # width   1,          # height   fill=False,    edgecolor='blue',   snap=False,   hatch='x' # the more slashes, the denser the hash lines))fig.colorbar(heatmap)# put the major ticks at the middle of each cellax.set_xticks(np.arange(data.shape[1])+0.5, minor=False)ax.set_yticks(np.arange(data.shape[0])+0.5, minor=False)# want a more natural, table-like displayax.invert_yaxis()ax.xaxis.tick_top()ax.set_xticklabels(row_labels, minor=False)ax.set_yticklabels(column_labels, minor=False)plt.show()


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/623545.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号