前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python-matplotlib 散点图配色设计

Python-matplotlib 散点图配色设计

作者头像
DataCharm
发布于 2021-02-22 07:04:58
发布于 2021-02-22 07:04:58
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

01. 引言

这篇推文还是python-matplotlib 散点图的绘制过程,涉及到的内容主要包括matplotlib ax.scatter()、hlines()、vlines()、text()添加小图片和定制化散点图图例样式等。前期的数据处理部分还是pandas、numpy库的灵活 应用(这里主要涉及可视化的设置,数据处理、分析部分后期会专门开设专辑进行教程讲解。当然大家有不理解地方可以后台和我交流)

02. 数据处理

2.1 原始数据

原始数据主要如下(部分):

首先对数据进行排序操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#按照'season','episode' 排序操作,并将na值放置最后
office = office.sort_values(by=['season','episode'],na_position='last')

这里提一下,后期构建的绘图数据集主要基于上数据集中“season”和“episode”两列数据。

2.2 构建绘图新数据

通过如下代码构建新的特征变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
office['episode_id'] = office.index + 1
office['episode_mod'] = office['episode_id'] + (9*office['season'])

结果如下:

分组操作:

这里分组操作涉及pandas的groupby()方法,这也是数据统计分析中常用步骤,本文分组统计求取平均值的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
avg_select = office[['season','imdb_rating','episode_id','episode_mod']].groupby(by=['season']).mean()
avg_select.reset_index()

网上好多咨询pandas 分组后无法像DataFrame一样进行查看,这里只需进行

reset_index()操作即可,结果如下:

接下来一步算是比较重要的数据处理过程了,即将groupby操作后的结果转成字典,然后再根据字典结果对生成新数据。操作如下:

生成字典:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
avg_select_dic = avg_select.to_dict()

结果如下:

注意红框标记的地方,下面根据字典生成新的特征列数据,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
office['avg'] = office['season'].apply(lambda x : avg_select_dic['imdb_rating'][x])
office['mid'] = office['season'].apply(lambda x : avg_select_dic['episode_mod'][x])

(这一步在数据处理过程中进行使用,希望大家可以直接掌握)结果如下:

接下来的分组操作也是非常重要和根据需求操作较多的数据处理过,笔者我也是查了些资料才实现自己的需求:即groupby()后根据不同列的值生成对应不同数据操作的数据结果,大家可以直接记住此步骤。棘突代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
office_line = office.groupby('season')[['episode_mod','avg']].agg(
    start_x = pd.NamedAgg(column='episode_mod',aggfunc = lambda x: min(x)-5),
    end_x = pd.NamedAgg(column = 'episode_mod',aggfunc = lambda x : max(x)+5),
    y = pd.NamedAgg(column='avg',aggfunc = lambda x : np.unique(x))).reset_index()
office_line

解释:

根据 episode_mod 列生成新特征start_x列,结果为 episode_mod 列的最小值减5;

根据 episode_mod 列生成新特征end_x列,结果为 episode_mod 列的最大值加5;

根据 avg 列生成新特征y列,结果为 avg 列的唯一值。

该操作在多数数据处理操作中经常遇到,如果觉得pandasz这样处理太过麻烦,也可以使用 R的 dplyr 包的mutate()方法结合if_else操作完成。因为本文主要介绍Matplotlib可视化绘制,数据处理也尽可能使用pandas进行数据处理。结果如下:

将宽数据转成长数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
office_line = office_line.melt(id_vars=['season','y'],value_vars=['start_x','end_x'],
                               var_name=['type'],value_name='x')

pandas的melt()方法可以实现此操作,结果如下(部分):

接下来的步骤也就是根据具体的需求进行特征构建,所涉及的操作步骤也就不叫简单(列表生成式结合if-else操作):代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
group01 = [y+.1 if type == 'start_x' else y-.1 for x, y in zip(office_line.type,office_line['x'])]
group02 = [y-.1 if (z == 'start_x') & (x == office_line.x.min()) else y for z, x,y in zip(office_line.type,office_line['x'],office_line.x_group)]
group03 = [y+.1 if (z == 'end_x') & (x == office_line.x.max()) else y for z, x,y in zip(office_line.type,office_line['x'],office_line.x_group)]

这里吐槽下:pandas数据处理方面确实有些不如R的dplyr包,也有可能是我还没找到好的方法进行处理

。最终的数据结果如下(部分):

03. 数据可视化

这里提下如下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from mpl_toolkits.axes_grid1.inset_locator import inset_axes

上述代码用于图片的添加,试了很多方法,还是这种效果最好,当然,如果是ggplot2 绘制的话,结合 png::readPNG()和cowplot包的draw_image()就可完美绘制。

颜色字典构建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
color = ("#486090", "#D7BFA6", "#6078A8", "#9CCCCC", "#7890A8", "#C7B0C1", 
         "#B5C9C9", "#90A8C0", "#A8A890")
season = office_line.season.to_list()
season_color = dict(zip(season,color))
season_color

完整代码如下:

解释(部分):

(1)第23-33行 主要就是hlines()和text()操作,注意之前的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for season in office_line['season'].values:

就是为了对不同season进行颜色赋值操作,其他步骤比较简单。text()操作涉及bbox属性的设置,具体如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bbox = dict(ec=season_color[season],fc='none',boxstyle='round')

ec 设置边框颜色,fc 设置填充颜色,boxstyle 设置边框的类型。

(2)第44-47行 主要对 vlines()垂直线段的设置,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ax.vlines(x=p1,ymin=p2,ymax=p3,color=season_color[season],lw=.8,zorder=2)

(3)第56-60行 图片的插入,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
img = image.imread(r'E:\Data_resourses\DataCharm 公众号\Python\office_ratings plots make\the-office.png')
axins2 = inset_axes(ax, width=1.5, height=.8,loc='lower left')
axins2.imshow(img,alpha=.7)
axins2.axis('off')

其中inset_axes 中的width和height属性分别设置图片显示的宽和高,loc位置设置。axins2.axis('off')去除刻度等属性特征。

(4)第64-76行 对散点图图例的定制化设置。其中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
labels = ['1500', '3000', '4500', '6000', '7500']
for i, label in enumerate(labels):
    legend.get_texts()[i].set_text(label)

是对散点图例label进行自定义设置。

最终可视化结果如下:

04. 总结

本片绘制推文还是灵活的使用python-matplotlib进行散点图的绘制,主要涉及的绘图技巧为:ax.scatter()、 hlines()、 vlines() 以及散点图例的定制绘制,其目的就是为了熟悉绘图技巧,同时也希望为大家提供绘图灵感和帮助。后期推文会尽可能使用matplotlib绘制。ggplot2的可视化绘制图文后期也会跟上的,希望大家能够喜欢。能力有限,有错误或者不理解的地方可以后台交流或加入 DataCharm交流群进行讨论。

为了大家更好的学习交流,DataCharm的学习交流群已经建立,由于群的二维码连接易失效,可以通过扫面下方二维码,添加本人微信,我拉你入群

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DataCharm 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
SpringBoot 使用 FTP 操作文件
因为在 Linux 上,root 用户是不能登陆 FTP 的。如果你输入的是 root 用户,登陆会失败的。
默存
2023/03/09
3.3K1
SpringBoot 使用 FTP 操作文件
基于spring boot sftp文件上传
对sftp文件上传将行封装,实现连接的单例模式,完成线程安全的改进,sftp文件上传下载失败的重试。
张泽旭
2018/12/10
2.9K0
Spring Boot 实现 SFTP 文件上传下载
近期由于系统迁移到docker容器,采用Spring Boot 框架实现微服务治理,在此基础上晚间批量文件服务器也由ftp改成sftp,由于之前ftp的实现是采用公具类的形式,在此基础之上,未屏蔽开发细节和依赖Spring Boot自动装配的特性,进行组件的自动装配和改造,旨在实现简化开发,提高文件传输的安全性和数据交互的可靠性。
周三不加班
2019/06/04
5K0
性能工具之Jmeter通过springboot工程启动
Jmeter平时性能测试工作一般都是通过命令行在linux下执行,为了锻炼自己代码与逻辑能力,想jmeter是否可以通过springboot工程启动,周末在家尝试写一写,一写原来需要处理很多事情,才可以启动起来,起来还是有很问题需要处理,下面是相应的代码,其实网上也有,但关键的是自己有意识收集知识,到用的时候能拿来改一改就用。
高楼Zee
2019/11/25
2.1K0
性能工具之Jmeter通过springboot工程启动
springboot中使用SFTP文件上传
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/03
3.4K0
删除个文件夹,vfs2上传文件到ftp就异常553,这么不经事吗
基于 commons-vfs2 实现文件到 FTP 服务器的上传,pom.xml 如下
青石路
2024/08/14
1160
删除个文件夹,vfs2上传文件到ftp就异常553,这么不经事吗
基于spring boot ftp文件上传
对ftp文件上传将行封装,实现连接的单例模式,完成线程安全的改进,ftp文件上传下载失败的重试。
张泽旭
2018/12/10
7.3K0
某低代码平台代码审计分析
类似shiro的权限绕过,可以利用static/../je/document/file绕过
红队蓝军
2024/07/01
1270
某低代码平台代码审计分析
Sftp工具类
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import ja
一笠风雨任生平
2019/08/02
3.8K0
SpringBoot整合自定义FTP文件连接池
说明:通过GenericObjectPool实现的FTP连接池,记录一下以供以后使用 环境: JDK版本1.8 框架 :springboot2.1 文件服务器: Serv-U 1.引入依赖
庞小明
2019/05/25
3.4K0
【愚公系列】2022年03月 C#帮助类-FTP的花样操作
文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。
愚公搬代码
2022/03/04
4510
springboot(十八):使用Spring Boot集成FastDFS
上篇文章介绍了《如何使用Spring Boot上传文件》,这篇文章我们介绍如何使用Spring Boot将文件上传到分布式文件系统FastDFS中。 这个项目会在上一个项目的基础上进行构建。 1、pom包配置 我们使用Spring Boot最新版本1.5.9、jdk使用1.8、tomcat8.0。 <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</artifactId> <vers
纯洁的微笑
2018/04/18
1.4K0
springboot(十八):使用Spring Boot集成FastDFS
FTP工具类
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.SocketException; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPCli
一笠风雨任生平
2019/08/02
1.5K0
C# FTP上传、下载、删除
文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,作为一套古老的网络工具,在工业界有着及其广泛的应用.本节主要给大家演示ftp对文件的上传、下载、以及删除。如果还没有ftp服务地址,请参考上节【使用filezilla server搭建ftp服务器】搭建下服务器。
用户9127601
2022/03/23
3.2K1
C# FTP上传、下载、删除
文件系统(02):基于SpringBoot框架,管理Xml和CSV
XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如数据结构,格式等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。适合网络传输,提供统一的方法来描述和交换应用程序的结构化数据。
知了一笑
2020/02/17
9030
文件系统(02):基于SpringBoot框架,管理Xml和CSV
Java通过FTP实现上传下载
今天是2022年9月27日,突发灵感再java中如何通过ftp实现上传以及下载,那么此文Java通过FTP实现上传下载为大家讲述一整套流程。
小颜同学
2023/08/24
8910
【FastFDS】SpringBoot整合FastDFS实战(附完整工程源码)
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
7320
【FastFDS】SpringBoot整合FastDFS实战(附完整工程源码)
造轮子之文件管理
前面我们完成了设置管理,接下来正好配合设置管理来实现文件管理功能。 文件管理自然包括文件上传,下载以及文件存储功能。设计要求可以支持扩展多种存储服务,如本地文件,云存储等等。
饭勺oO
2023/10/25
3240
造轮子之文件管理
使用JSch库进行SFTP连接
JSch是一个Java库,用于实现SSH2协议。JSch可以用于连接SSH服务器并进行各种远程操作,如文件传输、端口转发、远程执行命令等。
品茗IT
2023/10/22
1.6K0
sftp使用方法_sftp服务
参考:https://www.jianshu.com/p/64d571913185
全栈程序员站长
2022/11/10
5.6K0
相关推荐
SpringBoot 使用 FTP 操作文件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档