首页 文章 精选 留言 我的

精选列表

搜索[Python],共10000篇文章
优秀的个人博客,低调大师

Python数据可视化,seaborn如何做出非常规图表

公众号发送"可视化",获取源码与数据 前言 上一节我们单纯使用 matplotlib 制作出以下图表: 每年小麦产量柱状图 使用不同颜色标记最小与最大值的柱子 但是,如果只是制作标准的图表,我们有许多其他的选择。最常见的就是使用 seaborn ,他是基于 matplotlib 的包装。 这一节我们就来看看,如何使用 seaborn 生成标准图表,然后结合 matplotlib 做出定制效果。 特别是多系列的情况下,会有一些技巧。 本文目标图表是这样子: 2个系列。每个系列找出最小最大的柱子,标记成不同的颜色 本文所需要的库如下: 数据是这样子: 上一节做的事情如下: 设置 x 轴标签的旋转角度 设置某个指定柱状图的柱子颜色 简单把这些事情包装成函数: 使用 seaborn 的代码,实际与上一节直接使用 matplotlib 差不多: 看起来 seaborn 没有特别的地方! 这是因为我们只有一个系列(上图只涉及2个维度:wheat 与 year) 多系列 稍微修改一下数据, 行3、4、5:复制一份数据,小麦产量随机生成 行7、8:新增一个列"type",把数据划分成2类:"原始" 、"修改" 行10:合并成一份数据 行12:避免数据太多,图表不利于阅读,我只保留1750年以后的数据 现在数据成这样子: 每个年份都有2行记录,字段"type"可以区分他们 使用 seaborn 可以非常方便映射多个维度的数据: 行1:hue 是类别映射,通常如果有一个列数据是文本,就可以映射上去。这里把数据中的"type"字段映射 图表成这样子: 显然没有标记出最大值的柱子 同时也提示执行有错误 如果我们查看图表的容器就能看出关键: 原来,seaborn 柱子分成2组。这是非常合理的 但数据范围索引,却是在整个数据共27行中查找 显然,我们需要是2组的范围索引: 语义非常清晰直白 但是,怎么准确从图表容器中找到需要的 BarContainer: 行7与行12:里面的 0 和 1 都是猜测的 原来,seaborn 在生成这些容器时,给容器的 label 属性写入了对应的数据值(就是我们数据的"type"字段): 注意,你不能使用 key 索引方式获取,比如写: axcontainers['修改'] ,这会报错 万事俱备,定义如下函数: 现在调用变得非常简单: 图表成这样子: 接下来我会继续编写更多非常规要求的图表,敬请关注! 公众号发送"可视化",获取源码与数据 本文分享自微信公众号 - 数据大宇宙(data2fun)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

手把手教你用Python给小姐姐美个颜

云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 01 图像的颜色空间 彩色图像比灰度图像拥有更丰富的信息,它的每个像素通常是由红(R)、绿(G)、蓝(B)3个分量来表示的,每个分量介于0~255之间。 图像中呈现的不同的颜色都是由R、G、B这3种颜色混合而成的。在OpenCV里面,彩色图像拥有3个颜色通道,但是通道的顺序是可以变换的,RGB、BRG、BGR、GBR、GRB都有可能。 在读取一幅图像的时候,我们对于图像的颜色通道排布并不清楚,因此需要先把图像的颜色通道固定下来,这就需要调用OpenCV的cvtColor()函数。 cvtColor()函数的功能是对图像进行颜色空间变换,原型如下: dst=cv2.cvtColor(src, code ) 参数说明: src:输入图像即要进行颜色空间变换的原图像,可以是Mat类。 code:转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片,后面会详细讲述。 函数输出进行颜色空间变换后存储图像。 通过调用cvtColor()函数,还可以将一幅彩色图像转换成灰度图像,示例代码见程序3-5,代码运行效果如图3.9所示。 程序3-5 彩色图像转灰度图像示例:color2gray.py # -*- coding: UTF-8 -*- import numpy as np import cv2 #定义main()函数 def main(): img = cv2.imread('1.jpg') img2 = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) #从彩色图像转化成灰度图像 cv2.imshow('img2.bmp ', img2) cv2.waitKey(0) if __name__ == '__main__': main() 注意:cvtColor()函数还可以通过改变参数cv2.COLOR_RGB2BRG等改变图像颜色通道的排列顺序。另外也可以直接在读取图像函数imread时设置参数为0,直接将彩色图像读取为灰度图像,img = cv2.imread('1.jpg',0)。 02 彩色图像的通道分离和混合 灰度图像是单通道的,彩色图像拥有R、G、B三个颜色通道。因此在图像处理时,经常把颜色通道分离,单独处理一个通道的数组,然后再合并成一幅彩色图像。 在实际的代码编写中,只需要调用OpenCV中的split()和merge()函数就可以实现图像的通道分离和合并。 split()函数的功能是将多通道的矩阵分离成单通道矩阵,原型如下: [,mv]=cv2.split (src) 参数说明:输入参数为要进行分离的图像矩阵,输出参数为一个Mat数组。 merge()函数的功能是将多个单通道图像合成一幅多通道图像,原型如下: dst=cv2.merge([,dst] ) 参数说明:输入参数可以是Mat数组,输出为合并后的图像矩阵。 03 彩色图像的通道分离和混合程序示例 输入一幅彩色图像,通过程序3-6将其分割成R、G、B这3个通道的图像并显示。在分割前需要先确定图像的颜色通道分布,因此先调用cvtColor()函数固定颜色通道。示例代码参见程序3-6,效果如图3.10所示。 程序3-6 彩色图像通道分离示例:colorsplit.py # -*- coding: UTF-8 -*- import numpy as np import cv2 #定义main()函数 def main(): img = cv2.imread('1.jpg') img2 = cv2.cvtColor(img,cv2.COLOR_BRG2RGB) r,g,b = cv2.split(img2) #img分离成三个单通道的图像 cv2.imshow("Red", r) cv2.imshow("Green", g) cv2.imshow("Blue", b) cv2.waitKey(0) if __name__ == '__main__': main() 可以看出,在图像通道分离后,不同颜色通道的图像显示深浅不一,单通道的图像呈现该颜色通道的灰度信息。接下来把这3个颜色通道混合一下,在代码中加入一行代码:img3 = cv2.merge([b,g,r]);,这样img3又回到了原来输入的彩色图像样式,显示效果如图3.11所示。 04 彩色图像的二值化 图像的二值化是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。彩色图像二值化最简单的步骤如下: 1.彩色图像转灰度。2.图像阈值化处理,即像素值高于某阈值的像素赋值为255,反之为0。 其中,阈值的操作会调用OpenCV的threshold()函数。 threshold()函数声明如下: ret, dst = cv2.threshold(src, thresh, maxval, type); 函数功能:实现图像固定阈值的二值化。 参数说明: src:输入图,只能输入单通道图像,通常来说为灰度图。dst:输出图。thresh:阈值。maxval:当像素值超过了阈值(或者小于阈值,根据type来决定)时所赋予的值。type:二值化操作的类型,包含5种类型,即cv2.THRESH_BINARY、cv2.THRESH_BINARY_INV、cv2.THRESH_TRUNC、cv2.THRESH_TOZERO和cv2.THRESH_TOZERO_INV。 举例参考程序3-7。 程序3-7 彩色图像二值化示例:colorthreshold.py # -*- coding: UTF-8 -*- import numpy as np import cv2 #定义main()函数 def main(): img = cv2.imread('1.jpg',0) thresh1,dst =cv2.threshold(img,127,255,cv2.THRESH_BINARY) #图像二值化 cv2.imshow("dst", dst) cv2.waitKey(0) if __name__ == '__main__': main() 如程序3-7所示,高于127的像素全部置为255,低于的全部置为0,得到如图3.12所示的输出结果。 05 彩色图像的遍历 灰度图像的遍历按照访问二维数组的方式得到坐标位置的像素。那对于彩色图像呢?彩色图像可以看出是3维数组,遍历方式参见程序3-8。 程序3-8 遍历彩色图像示例:color1.py # -*- coding: UTF-8 -*- import numpy as np import cv2 #定义main()函数 def main(): img = cv2.imread('1.jpg') height,width,n = img.shape #得到图片的宽高和维度 img2 = img.copy() #复制一个跟img相同的新图片 #宽高两个维度遍历图片 for i in range(height): for j in range(width): img2[i, j][0] = 0 #将第一个通道内的元素重新赋值 cv2.imshow('img2.jpg', img2) cv2.waitKey(0) if __name__ == '__main__': main() 由于第一个通道里面的颜色信息全部变为了0,图像显示结果如图3.13所示。 在读取不同通道的图像像素值时,需要先确定图像的通道排列是RGB还是BRG。 06 彩色图像和灰度图像的转换 经过前面的学习,我们知道彩色图像转成灰度图像有3种路径: imread读取图像的时候直接设置参数为0,彩色图像自动被读成灰度图像。调用cvtColor()函数,参数设置为cv2.COLOR_BGR2GRAY。调用split()函数,可以将一幅彩色图像分离成3个单通道的灰度图像。 那么灰度图像有没有可能转换成彩色图像呢? 我们知道灰度图像是单通道的,彩色图像是RGB 3这个颜色通道。那么是否可以人为地增加图像的通道,伪造出另外两个通道,而另外两个通道可以随机地赋值呢?程序3-9做出了尝试。 程序3-9 增加图像通道示例:gray2color1.py # -*- coding: UTF-8 -*- import numpy as np import cv2 #定义main()函数 def main(): img = cv2.imread('gray1.jpg') gray = np.zeros((512, 512, 3), np.uint8) # 生成一个空彩色图像 height,width,n = img.shape #图像像素级遍历 for i in range(height): for j in range(width): gray[i, j][0] = img[i, j][0] gray[i, j][1] = 0 gray[i, j][2] = 0 cv2.imshow('gray.jpg', gray) cv2.waitKey(0) =if __name__ == '__main__': main() 上述程序新建了一个3通道的空的彩色图像,然后将读取的灰度图像放在新建的彩色图像的第一个通道,也就是B通道,其他两个通道赋值0,所以图像整体呈现蓝色,程序运行结果如图3.14所示。 上述方法转换的图像颜色很单一。有没有更加智能的方法呢?在摄像技术不是很成熟的时期,人们给拍摄出来的黑白照片上色,发明了一种伪彩色图像技术。在OpenCV里面,可以用预定义好的Colormap(色度图)来给图片上色,示例代码参见程序3-10。 程序3-10 伪彩色图像技术示例:gray2color2.py # -*- coding: UTF-8 -*- import numpy as np import cv2 #定义main()函数 def main(): img = cv2.imread('gray1.jpg') im_color = cv2.applyColorMap(img, cv2.COLORMAP_JET) #色度图上色 cv2.imshow("im_color.jpg", im_color) cv2.waitKey(0) if __name__ == '__main__': main() 程序运行结果如图3.15所示。伪彩色图像目前主要应用在对高度、压力、密度、湿度等描述上,彩色数据可视化。 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/zhibo 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK 原文发布时间:2020-05-25本文作者: 方圆圆 本文来自:“大数据DT 微信公众号”,了解相关信息可以关注“大数据DT”

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册