热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何用Matplotlib画一张好看的图

本文用的数据如图所示,Dataframe中显示的是相关职位对应的地区和相应的薪水状况,单位是千,要统计各个城市的薪资状况。最终目的是用Ma


本文用的数据如图所示,Dataframe中显示的是相关职位对应的地区和相应的薪水状况,单位是千,要统计各个城市的薪资状况

最终目的是用Matplotlib结合Seaborn得到这种可视化效果

首先,导入要用到的包,由于需要在图中显示中文字,还需要进行一些字体的设置。

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline# 设置中文字体为微软雅黑
plt.rcParams['font.sans-serif'] = 'SimHei'

先用Seaborn生成一张基础的柱状图,并给图加上标题,之后围绕这张图进行进一步的修改。

fig,ax = plt.subplots(figsize=(9,6))
sns.barplot(x='city',y='salary',data=df,ci=95,ax=ax)
ax.set_title('各城市薪资水平对比')

可以比较明显看出横纵坐标的刻度标签的字体有点小,同时刻度线显示起来不好看,所以第一步把刻度标签的字体放大去掉刻度线

由于刻度的设置是tick的属性,所以用ax.tick_param()进行设置,用参数labelsize指定刻度标签的大小,将length参数设置刻度线长短。

fig,ax = plt.subplots(figsize=(9,6))
sns.barplot(x='city',y='salary',data=df,ci=95,ax=ax)
ax.set_title('各城市薪资水平对比')# 字体为16px大小,刻度线长度为0
ax.tick_params(labelsize=16,length=0)

第二步,去掉四边的边框(真的不好看),这里有两种实现方式。

第一种是用上篇文章说过的ax.spines['xx'].set_visible(False)分别对topbottoomleftright进行设置。

第二种方式,由于这里只有一个Axes且四个边框都去掉,所以也可以直接使用plt.box(False)

fig,ax = plt.subplots(figsize=(9,6))
sns.barplot(x='city',y='salary',data=df,ci=95,ax=ax)
ax.set_title('各城市薪资水平对比')# 字体为16px大小,刻度线长度为0
ax.tick_params(labelsize=16,length=0)#法一:
ax.spines['left'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)#法二
plt.box(False)

接下来,为了使条形图呈从小到大渐变的效果,可以指定各个城市的排列顺序,并设置相应的颜色映射

对各个城市的薪水求均值并从小到大排序,获取城市排序列表city_order

city_order = df.groupby("city")["salary"].mean()\.sort_values()\.index.tolist()

然后用Seaborn中的orderpalette分别设置排列顺序颜色。

fig,ax = plt.subplots(figsize=(9,6))
sns.barplot(x='city',y='salary',data=df,ci=95,ax=ax,order = city_order,palette = "RdBu_r")
ax.set_title('各城市薪资水平对比')# 字体为16px大小,刻度线长度为0
ax.tick_params(labelsize=16,length=0)
plt.box(False)

紧接着在y轴上添加网格线便于观察每个柱子的数值大小,因为是在y轴上,网格线为grid,所以用ax.yaxis.grid()进行设置

fig,ax = plt.subplots(figsize=(9,6))
sns.barplot(x='city',y='salary',data=df,ci=95,ax=ax,order = city_order,palette = "RdBu_r")
ax.set_title('各城市薪资水平对比')# 字体为16px大小,刻度线长度为0
ax.tick_params(labelsize=16,length=0)
plt.box(False)# 设置y轴网格线
ax.yaxis.grid(linewidth=0.5,color='black')
# 将网格线置于底层
ax.set_axisbelow(True)

由于x轴和y轴含义比较清晰,所以可以将横纵坐标的标签去掉,同时,为了更直观,可以将y轴的刻度标签由20,15...换成20k,15k...

这个过程分别用到ax.set_xlabel(),ax.set_ylabel()ax.set_yticklabels()

fig,ax = plt.subplots(figsize=(9,6))
sns.barplot(x='city',y='salary',data=df,ci=95,ax=ax,order = city_order,palette = "RdBu_r")
ax.set_title('各城市薪资水平对比')# 字体为16px大小,刻度线长度为0
ax.tick_params(labelsize=16,length=0)
plt.box(False)# 设置y轴网格线
ax.yaxis.grid(linewidth=0.5,color='black')
# 将网格线置于底层,
ax.set_axisbelow(True)ax.set_xlabel('')
ax.set_ylabel('')
# 将0处设为空字符串,其他地方加上k
ax.set_yticklabels([" ","5k","10k","15k","20k"])

最后对标题进行设置,让标题更加好看,这一步主要是对ax.set_title()中的参数进行调整,主要包括

  • backgroundcolor:控制背景颜色

  • fontsize:控制字体大小

  • weight:控制字体粗细

  • color:控制字体颜色

fig,ax = plt.subplots(figsize=(9,6))sns.barplot(x='city',y='salary',data=df,ci=95,ax=ax,order = city_order,palette = "RdBu_r")# 字体为16px大小,刻度线长度为0
ax.tick_params(labelsize=16,length=0)
plt.box(False)# 设置y轴网格线
ax.yaxis.grid(linewidth=0.5,color='black')
# 将网格线置于底层,
ax.set_axisbelow(True)ax.set_xlabel('')
ax.set_ylabel('')
# 将0处设为空字符串,其他地方加上k
ax.set_yticklabels([" ","5k","10k","15k","20k"])ax.set_title(' 各城市薪资水平对比 ',backgroundcolor='#3c7f99',fontsize=24, weight='bold',color='white')

我讲的比较细,所以可能会让大家觉得画起来挺复杂的,其实数数最后的代码也就10行代码,只是细节的地方比较多。如果把之前两篇相关文章看懂了,相信这篇理解起来难度并不大。

好了,从此之后你用Matplotlib画出来的图就是和别人不一样!

推荐阅读:

一文读懂高并发情况下的常见缓存问题

用 Django 开发基于以太坊智能合约的 DApp

一文读懂 Python 分布式任务队列 celery

5 分钟解读 Python 中的链式调用

用 Python 创建一个比特币价格预警应用

▼点击成为社区会员   喜欢就点个在看吧


推荐阅读
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 解决python matplotlib画水平直线的问题
    本文介绍了在使用python的matplotlib库画水平直线时可能遇到的问题,并提供了解决方法。通过导入numpy和matplotlib.pyplot模块,设置绘图对象的宽度和高度,以及使用plot函数绘制水平直线,可以解决该问题。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • java drools5_Java Drools5.1 规则流基础【示例】(中)
    五、规则文件及规则流EduInfoRule.drl:packagemyrules;importsample.Employ;ruleBachelorruleflow-group ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • Tkinter Frame容器grid布局并使用Scrollbar滚动原理
    本文介绍了如何使用Tkinter实现Frame容器的grid布局,并通过Scrollbar实现滚动效果。通过将Canvas作为父容器,使用滚动Canvas来滚动Frame,实现了在Frame中添加多个按钮,并通过Scrollbar进行滚动。同时,还介绍了更新Frame大小和绑定滚动按钮的方法,以及配置Scrollbar的相关参数。 ... [详细]
  • 广度优先遍历(BFS)算法的概述、代码实现和应用
    本文介绍了广度优先遍历(BFS)算法的概述、邻接矩阵和邻接表的代码实现,并讨论了BFS在求解最短路径或最短步数问题上的应用。以LeetCode中的934.最短的桥为例,详细阐述了BFS的具体思路和代码实现。最后,推荐了一些相关的BFS算法题目供大家练习。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
author-avatar
艳红双唇l丶乱了他神
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有