34.热图(heatmap)
34.1.创建带注释的热图
34.2.使用辅助函数的代码样式
35.图像显示
35.1.图像插值
35.2.将图像数据导入Numpy数组
35.3.将numpy数组绘制为图像

34.热图(heatmap)

34.1.创建带注释的热图

将依赖于两个自变量的数据显示为彩色图像图,通常称为热图。如果数据是分类的,则将其称为分类热图。 Matplotlib的imshow函数使这种绘图的制作特别容易。

以下示例显示了如何创建带有注释的热图。我们将从一个简单的分类热图开始。

我们可以从定义一些数据开始。我们需要一个2D列表或数组,用于将数据定义为颜色代码。然后,我们还需要两个列表或类别数组;当然,这些列表中的元素数量需要与各个轴上的数据匹配。

热图本身是一个imshow图,其标签设置为拥有的类别。请注意,必须同时设置刻度位置(set_xticks)和刻度标签(set_xticklabels),否则它们将变得不同步。位置只是升序的整数,而ticklabels是要显示的标签。最后,可以通过在每个单元格中创建一个显示该单元格值的文本来标记数据本身。

import numpy as np
import matplotlib
import matplotlib.pyplot as pltvegetables = ["cucumber", "tomato", "lettuce", "asparagus","potato", "wheat", "barley"]
farmers = ["Farmer Joe", "Upland Bros.", "Smith Gardening","Agrifun", "Organiculture", "BioGoods Ltd.", "Cornylee Corp."]harvest = np.array([[0.8, 2.4, 2.5, 3.9, 0.0, 4.0, 0.0],[2.4, 0.0, 4.0, 1.0, 2.7, 0.0, 0.0],[1.1, 2.4, 0.8, 4.3, 1.9, 4.4, 0.0],[0.6, 0.0, 0.3, 0.0, 3.1, 0.0, 0.0],[0.7, 1.7, 0.6, 2.6, 2.2, 6.2, 0.0],[1.3, 1.2, 0.0, 0.0, 0.0, 3.2, 5.1],[0.1, 2.0, 0.0, 1.4, 0.0, 1.9, 6.3]])plt.figure(figsize=(16,16))
fig, ax = plt.subplots()
im = ax.imshow(harvest)# We want to show all ticks...
ax.set_xticks(np.arange(len(farmers)))
ax.set_yticks(np.arange(len(vegetables)))
# ... and label them with the respective list entries
ax.set_xticklabels(farmers)
ax.set_yticklabels(vegetables)# Rotate the tick labels and set their alignment.
plt.setp(ax.get_xticklabels(), rotation=45, ha="right",rotation_mode="anchor")# Loop over data dimensions and create text annotations.
for i in range(len(vegetables)):for j in range(len(farmers)):text = ax.text(j, i, harvest[i, j],ha="center", va="center", color="w")ax.set_title("Harvest of local farmers (in tons/year)")
#fig.tight_layout()
plt.show()

34.2.使用辅助函数的代码样式

人们可能想重用这种代码来为不同的输入数据和/或在不同的轴上创建某种热图。 我们创建一个函数,该函数将数据以及行和列标签作为输入,并允许使用用于自定义绘图的参数

在这里,除了上面的内容外,我们还希望创建一个颜色栏,并将标签放置在热图上方而不是其下方。 注释将根据阈值获得不同的颜色,以更好地与像素颜色形成对比。 最后,我们将周围的轴旋转并创建白线网格以分隔单元格。

import numpy as np
import matplotlib
import matplotlib.pyplot as pltdef heatmap(data, row_labels, col_labels, ax=None,cbar_kw={}, cbarlabel="", **kwargs):"""Create a heatmap from a numpy array and two lists of labels.Parameters----------dataA 2D numpy array of shape (N, M).row_labelsA list or array of length N with the labels for the rows.col_labelsA list or array of length M with the labels for the columns.axA `matplotlib.axes.Axes` instance to which the heatmap is plotted.  Ifnot provided, use current axes or create a new one.  Optional.cbar_kwA dictionary with arguments to `matplotlib.Figure.colorbar`.  Optional.cbarlabelThe label for the colorbar.  Optional.**kwargsAll other arguments are forwarded to `imshow`."""if not ax:ax = plt.gca()# Plot the heatmapim = ax.imshow(data, **kwargs)# Create colorbarcbar = ax.figure.colorbar(im, ax=ax, **cbar_kw)cbar.ax.set_ylabel(cbarlabel, rotation=-90, va="bottom")# We want to show all ticks...ax.set_xticks(np.arange(data.shape[1]))ax.set_yticks(np.arange(data.shape[0]))# ... and label them with the respective list entries.ax.set_xticklabels(col_labels)ax.set_yticklabels(row_labels)# Let the horizontal axes labeling appear on top.ax.tick_params(top=True, bottom=False,labeltop=True, labelbottom=False)# Rotate the tick labels and set their alignment.plt.setp(ax.get_xticklabels(), rotation=-30, ha="right",rotation_mode="anchor")# Turn spines off and create white grid.for edge, spine in ax.spines.items():spine.set_visible(False)ax.set_xticks(np.arange(data.shape[1] + 1) - .5, minor=True)ax.set_yticks(np.arange(data.shape[0] + 1) - .5, minor=True)ax.grid(which="minor", color="w", linestyle='-', linewidth=3)ax.tick_params(which="minor", bottom=False, left=False)return im, cbardef annotate_heatmap(im, data=None, valfmt="{x:.2f}",textcolors=["black", "white"],threshold=None, **textkw):"""A function to annotate a heatmap.Parameters----------imThe AxesImage to be labeled.dataData used to annotate.  If None, the image's data is used.  Optional.valfmtThe format of the annotations inside the heatmap.  This should eitheruse the string format method, e.g. "$ {x:.2f}", or be a`matplotlib.ticker.Formatter`.  Optional.textcolorsA list or array of two color specifications.  The first is used forvalues below a threshold, the second for those above.  Optional.thresholdValue in data units according to which the colors from textcolors areapplied.  If None (the default) uses the middle of the colormap asseparation.  Optional.**kwargsAll other arguments are forwarded to each call to `text` used to createthe text labels."""if not isinstance(data, (list, np.ndarray)):data = im.get_array()# Normalize the threshold to the images color range.if threshold is not None:threshold = im.norm(threshold)else:threshold = im.norm(data.max()) / 2.# Set default alignment to center, but allow it to be# overwritten by textkw.kw = dict(horizontalalignment="center",verticalalignment="center")kw.update(textkw)# Get the formatter in case a string is suppliedif isinstance(valfmt, str):valfmt = matplotlib.ticker.StrMethodFormatter(valfmt)# Loop over the data and create a `Text` for each "pixel".# Change the text's color depending on the data.texts = []for i in range(data.shape[0]):for j in range(data.shape[1]):kw.update(color=textcolors[int(im.norm(data[i, j]) > threshold)])text = im.axes.text(j, i, valfmt(data[i, j], None), **kw)texts.append(text)return textsvegetables = ["cucumber", "tomato", "lettuce", "asparagus","potato", "wheat", "barley"]
farmers = ["Farmer Joe", "Upland Bros.", "Smith Gardening","Agrifun", "Organiculture", "BioGoods Ltd.", "Cornylee Corp."]harvest = np.array([[0.8, 2.4, 2.5, 3.9, 0.0, 4.0, 0.0],[2.4, 0.0, 4.0, 1.0, 2.7, 0.0, 0.0],[1.1, 2.4, 0.8, 4.3, 1.9, 4.4, 0.0],[0.6, 0.0, 0.3, 0.0, 3.1, 0.0, 0.0],[0.7, 1.7, 0.6, 2.6, 2.2, 6.2, 0.0],[1.3, 1.2, 0.0, 0.0, 0.0, 3.2, 5.1],[0.1, 2.0, 0.0, 1.4, 0.0, 1.9, 6.3]])fig, ax = plt.subplots()im, cbar = heatmap(harvest, vegetables, farmers, ax=ax,cmap="YlGn", cbarlabel="harvest [t/year]")
texts = annotate_heatmap(im, valfmt="{x:.1f} t")fig.tight_layout()
plt.show()

35.图像显示

在Matplotlib中绘制图像的最常见的方法是使用imshow().

另外,PIL(Python Imaging Library)是Python常用的图像处理库,而Pillow是PIL的一个友好Fork,提供了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。

35.1.图像插值

在显示图像之前可以对图像进行插值。 在下面,我们将显示相同的数组,并使用三种不同的插值方法进行插值。

A[i,j]处的像素中心绘制在i + 0.5,i + 0.5处。 如果使用interpolation=‘nearest’,则由(i,j) 和 (i+1,j+1)界定的区域将具有相同的颜色。 如果使用插值,则像素中心的颜色将与最接近的颜色相同,但是其他像素将在相邻像素之间插值。

为了防止在进行插值时产生边缘效应,Matplotlib将输入数组的边缘填充相同的像素:如果有一个5x5数组,其颜色为a-y,如下所示:

Matplotlib计算插值并在填充数组上调整大小

然后提取结果的中心区域。

这种方法可以绘制一个数组的整个范围而没有边缘效应,例如,可以使用不同的插值方法将多个具有不同大小的图像相互层叠。 复杂的内插还意味着性能下降; 为了获得最佳性能或非常大的图像,建议使用插值interpolation=‘nearest’。

import numpy as np
import matplotlib.pyplot as pltA = np.random.rand(5, 5)fig, axs = plt.subplots(1, 3, figsize=(10, 3))
for ax, interp in zip(axs, ['nearest', 'bilinear', 'bicubic']):ax.imshow(A, interpolation=interp)ax.set_title(interp.capitalize())ax.grid(True)plt.show()

35.2.将图像数据导入Numpy数组

Pillow库支持加载图像数据。

这是一个24位 RGB PNG图像(R,G,B分别为8比特)。 根据获取的数据位置,还有可能会遇到的其他类型的图像,如RGBA图像,该图像允许透明或单通道灰度(亮度)图像。

import matplotlib.image as mpimgimg = mpimg.imread('cat.png')
print(img)
输出结果:
[[[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]...[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]][[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]...[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]][[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]...[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]]...[[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]...[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]][[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]...[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]][[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]...[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]]]

35.3.将numpy数组绘制为图像

将数据存储在numpy数组中(通过导入或生成), 然后渲染它。 在Matplotlib中,这是使用imshow()函数执行的。 在这里,我们使用了plot对象。

import matplotlib.pyplot as plt
import matplotlib.image as mpimgimg = mpimg.imread('cat.png')
print(img)imgplot = plt.imshow(img)
plt.show()
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open('cat.png')
# img = mping.imread('cat.png')
gray = img.convert('L')    # 其中img.convert指定一种色彩模式:L (8-bit pixels, black and white)
# 分离rgba
r, g, b, a  = img.split()
plt.figure("girl")def setPlot(num, title):# subplot(nrows, ncols, plot_number)# 图表的整个绘图区域被等分为numRows行和numCols列,然后按照从左到右、从上到下的顺序对每个区域进行编号,左上区域的编号为1plt.subplot(2, 3, num)plt.title(title)plt.axis('off')setPlot(1, 'origin')
plt.imshow(img)setPlot(2, 'gray')
plt.imshow(gray, cmap='gray')setPlot(3, 'gray')
plt.imshow(gray, cmap='gray')setPlot(3,'rgba')
# 合并rgba
plt.imshow(Image.merge('RGBA', (r, g, b, a)))setPlot(4, 'r')
plt.imshow(r)setPlot(5, 'g')
plt.imshow(g)setPlot(6, 'b')
plt.imshow(b)plt.show()

34.35.热图(heatmap)、创建带注释的热图、使用辅助函数的代码样式、图像显示、图像插值、将图像数据导入Numpy数组、将numpy数组绘制为图像相关推荐

  1. cocos2dx中使用JPG图和只带Alpha的PNG图合成渲染

    手游控制安装包的大小是非常重要的,这里介绍一种方法.将带Alpha通道的PNG图片分拆成RGB和Alpha分别保存,其中保存RGB的这张图把它转换成JPG格式的文件,保存Alpha图片的就用PNG格式 ...

  2. python制作动图、怎么运行_用Python2.7运行下面这个代码,但是出现了问题,请问如何可以解决,使之生成图像?...

    Process finished with exit code -1073741795 (0xC000001D) 这是什么意思,如何可以解决这个问题. import numpy as np from ...

  3. python 通达信板块_[python]沪深龙虎榜数据导入通达信的自选板块,并标注于K线图上...

    将沪深龙虎榜数据导入通达信的自选板块,并标注于K线图上 原理:python读取前一次处理完的计算5日后涨跌幅输出的csv文件 文件名前加"[paint]" 安照通达信的画图文件和板 ...

  4. matlab可以画3d图吗,如何用matlab画3d图

    MATLAB三维绘图解读_自考_成人教育_教育专区.MATLAB 上次课内容回顾 1. 2. ? ? ? 3. 4. 5. MATLAB二维绘图 离散函数和数据的可视化; 二维曲线和图形 plot.. ...

  5. 热图3:热图行列分组信息注释

    这次我们要让热图更加复杂化. 实际上,有些情况下做热图可能只需要标注对照组.实验组即可.但是大多时候,可以在热图上体现更多信息,比如,除了分组,还有不同得处理.年龄.性别.疾病阶段等等,以及不同功能基 ...

  6. 如何在R语言中建立六边形矩阵热图heatmap可视化

    原文链接:http://tecdat.cn/?p=18879 这是一个六边形热图可视化程序,主要用到的知识RColorBrewer,fields,也就是R中的可视化绘图库(点击文末"阅读原文 ...

  7. 【Revit 二次开发 】创建带箭头的文字注释(字体设置+引线箭头设置)

    此篇文章仅是自己的开发经验分享,不具备官方参考价值,如有不足,欢迎批评指正 开发目的: 创建一个带箭头的文字注释 字体为新宋体,大小2.5mm,宽度系数0.7,箭头为30度实心箭头 like this ...

  8. 热图pheatmap 热图3:热图行列分组信息注释

    热图pheatmap library(pheatmap) getwd() setwd("D:\Win10 System\Documents\WeChat Files\wxid_f27yna0 ...

  9. PowerDesigner生成带中文注释的ER图

    PowerDesigner生成带中文注释的ER图 前言:参考资料 本文结合自己的需求和遇到问题,参考以下三篇文章,终于解决问题,谢谢三篇文章的作者! 第一篇:https://blog.csdn.net ...

最新文章

  1. 问题总结两天来两场实习面试(中科创达、华为)
  2. 你敢参与,我就敢送!牛转好运来,新春大抽奖
  3. 基础练习 数列排序 c语言
  4. 期货与期权(part6)--保证金
  5. 结语|日拱一卒无有尽,功不唐捐终入海
  6. Objective-c方法调用流程
  7. 数美科技-AI独角兽-NLP/语音/图像等岗位等你来~
  8. 谐波小波 matlab,基于谐波小波的电力系统谐波分析
  9. 北斗卫星导航有哪些频段
  10. 使用海龟绘图,输出四个不同颜色矩形
  11. 区块链是什么意思 如何简单明了的理解区块链
  12. 大数据python试卷_大数据分析的python基础-中国大学mooc-试题题目及答案
  13. mysql 从从(主主)复制(故障转移)
  14. 机器学习中常见的几种归一化方法以及原因
  15. 在Windows上使用Cygwin源码安装tig
  16. github热门java项目_盘点Github上热门的Java开源项目
  17. PTA L1-030 一帮一(详解)
  18. 重新理解CNN(精)(为什么多个滤波器?....)
  19. 【C++】复数域内的二次函数系数的求解
  20. html input光标位置,js控制input框内光标位置(setSelectionRange详解)

热门文章

  1. 1024-程序员节快乐!给大家发福利啦!以及向大家讲述节日由来
  2. Python基本数据类型(三)
  3. wxWidgets:wxAny类用法
  4. boost::basic_thread_pool相关的测试程序
  5. boost::python模块实现使用原始指针访问数据的示例
  6. boost::mp11::mp_partial_sum相关用法的测试程序
  7. boost::hana::product用法的测试程序
  8. GDCM:DICOM文件转储图像标题信息的测试程序
  9. 测试core :: demangled_name
  10. ITK:使用Viola Wells互信息执行多模式注册