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

Python-matplotlib 散点图绘制02

作者头像
DataCharm
发布于 2021-02-22 07:00:21
发布于 2021-02-22 07:00:21
1K02
代码可运行
举报
运行总次数:2
代码可运行

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交流群进行讨论。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
Spark/Flink广播实现作业配置动态更新
那么问题来了:配置每次变化都得手动修改代码,再重启作业吗?答案显然是否定的,毕竟实时任务的终极目标就是7 x 24无间断运行。Spark Streaming和Flink的广播机制都能做到这点,本文分别来简单说明一下。
王知无-import_bigdata
2019/12/05
2K0
Spark/Flink广播实现作业配置动态更新
Spark架构模式与Flink的对比
Spark和Flink都属于流批一体的分布式计算引擎。Flink属于流处理框架,通过流来模拟批,Spark属于批处理框架,通过批来模拟流。其分别属于Lambda架构和Dataflow架构。
Tim在路上
2022/03/23
8540
Spark架构模式与Flink的对比
全网最详细4W字Flink全面解析与实践(上)
在大数据技术栈的探索中,我们曾讨论了离线计算的Spark,而当谈到实时计算,就不得不提Flink。本文将集中讨论Flink,旨在详尽展示其核心概念,从而助力你在大数据旅程中向前迈进。
BookSea
2023/10/28
1.2K2
全网最详细4W字Flink全面解析与实践(上)
Spark中广播变量详解以及如何动态更新广播变量
【前言:Spark目前提供了两种有限定类型的共享变量:广播变量和累加器,今天主要介绍一下基于Spark2.4版本的广播变量。先前的版本比如Spark2.1之前的广播变量有两种实现:HttpBroadcast和TorrentBroadcast,但是鉴于HttpBroadcast有各种弊端,目前已经舍弃这种实现,本篇文章也主要阐述TorrentBroadcast】
大数据学习与分享
2020/08/10
4.8K0
flink实战-使用广播实现报警阈值动态更新
紧接着上一篇文章【FLINK实战-使用CEP进行网站监控报警和报警恢复】,上一篇主要讲了怎么对数据流做监控报警,但是实际生产环境中,可能我们对这个报警的阈值设置成多大也没有一个准,可能需要根据经验不断的来修改,所以就涉及了可能需要不断的修改这个报警的阈值,但是如果每次修改了之后,都通过重启flink程序来实现,这个成本就有点高了,所以我们这次主要是讲解一下,如何使用flink的广播动态的更新配置来设置这个报警的阈值.
大数据技术与应用实战
2020/09/15
1.6K0
Flink 原理详解
Flink 是一个流处理框架,支持流处理和批处理,特点是流处理有限,可容错,可扩展,高吞吐,低延迟。
Tim在路上
2020/08/04
3.5K0
Flink1.13架构全集| 一文带你由浅入深精通Flink方方面面
导读:Flink是由德国几所大学发起的的学术项目,后来不断发展壮大,并于2014年末成为Apache顶级项目。Flink如何在流处理中多得王者地位?带着问题在文章寻找答案吧。
857技术社区
2022/12/18
2.2K0
Flink1.13架构全集| 一文带你由浅入深精通Flink方方面面
全网最详细4W字Flink入门笔记(上)
因为公司用到大数据技术栈的缘故,之前也写过HBase,Spark等文章,公司离线用的是Spark,实时用的是Flink,所以这篇文章是关于Flink的,这篇文章对Flink的相关概念介绍的比较全面,希望对大家学习Flink能有所帮助。
BookSea
2023/07/16
1.2K0
全网第一 | Flink学习面试灵魂40问答案!
Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink提供了诸多更高抽象层的API以便用户编写分布式任务:
大数据真好玩
2019/09/17
10.6K0
全网第一 | Flink学习面试灵魂40问答案!
Spark Streaming VS Flink
本文从编程模型、任务调度、时间机制、Kafka 动态分区的感知、容错及处理语义、背压等几个方面对比 Spark Stream 与 Flink,希望对有实时处理需求业务的企业端用户在框架选型有所启发。本文篇幅较长,建议先收藏~
美图数据技术团队
2018/08/22
1.8K0
Spark Streaming VS Flink
Flink 极简教程: 架构及原理 Apache Flink® — Stateful Computations over Data Streams
Apache Flink 是一个分布式流计算引擎,用于在无边界和有边界数据流上进行有状态的计算。
一个会写诗的程序员
2022/01/04
3.4K0
Flink 极简教程: 架构及原理 Apache Flink® — Stateful Computations over Data Streams
Flink面试通关手册
2019 年是大数据实时计算领域最不平凡的一年,2019 年 1 月阿里巴巴 Blink (内部的 Flink 分支版本)开源,大数据领域一夜间从 Spark 独步天下走向了两强争霸的时代。Flink 因为其天然的流式计算特性以及强大的处理性能成为炙手可热的大数据处理框架。
大数据真好玩
2019/12/09
1.4K0
Flink面试通关手册
收藏|Flink比Spark好在哪?
Flink 是一个面向分布式数据流处理和批量数据处理的开源计算平台。和 Spark 类似,两者都希望提供一个统一功能的计算平台给用户,都在尝试建立一个统一的平台以运行批量,流式,交互式,图处理,机器学习等应用。
数据社
2020/10/09
1.1K0
收藏|Flink比Spark好在哪?
Flink(一)
Apache Flink(德语:快速灵巧,原德国柏林大学基金会项目)是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。ms级别水平。data flow+event sequence。
matt
2022/10/25
6090
Flink(一)
2021年大数据Flink(四十二):​​​​​​​BroadcastState
在开发过程中,如果遇到需要下发/广播配置、规则等低吞吐事件流到下游所有 task 时,就可以使用 Broadcast State。Broadcast State 是 Flink 1.5 引入的新特性。
Lansonli
2021/10/11
8310
Flink 面试题
Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。并且 Flink 提供了数据分布、容错机制以及资源管理等核心功能。
Tim在路上
2020/08/05
1.4K0
五万字 | Flink知识体系保姆级总结
一、Flink简介 二、Flink 部署及启动 三、Flink 运行架构 四、Flink 算子大全 五、流处理中的 Time 与 Window 六、Flink 状态管理 七、Flink 容错 八、Flink SQL 九、Flink CEP 十、Flink CDC 十一、基于 Flink 构建全场景实时数仓 十二、Flink 大厂面试题
五分钟学大数据
2021/09/22
4.6K0
Flink 介绍
Apache Flink是一个分布式处理引擎,用于在无界和有界数据流上进行有状态的计算。它在所有的通用集群环境中都可以运行,在任意规模下都可以达到内存级的计算速度。
程序员白总
2024/02/18
2590
Flink 介绍
《基于Apache Flink的流处理》读书笔记
前段时间详细地阅读了 《Apache Flink的流处理》 这本书,作者是 Fabian Hueske&Vasiliki Kalavri,国内崔星灿翻译的,这本书非常详细、全面得介绍了Flink流处理,并且以气象数据的例子讲解其中的使用,我把其中一些比较重要的句子做了比较,并且分享给大家。有一些我不是很理解,需要以后慢慢去消化,我就不做详细的展开。
班班
2022/10/11
1.2K0
《基于Apache Flink的流处理》读书笔记
Flink教程(30)- Flink VS Spark[通俗易懂]
Spark Streaming 运行时的角色(standalone 模式)主要有:
全栈程序员站长
2022/11/16
1.6K0
Flink教程(30)- Flink VS Spark[通俗易懂]
推荐阅读
相关推荐
Spark/Flink广播实现作业配置动态更新
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档