Matplotlib 的正确使用方法,画一张好看的图
前言
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
作者:Python中文社区

本文用的数据如图所示,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)分别对top、bottoom、left和right进行设置。
第二种方式,由于这里只有一个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中的order和palette分别设置排列顺序和颜色。
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')

Matplotlib 的正确使用方法,画一张好看的图的更多相关文章
- MATLAB 出一张好看的图
1.坐标轴的视点(viewpoint):从哪个方向看整个坐标系统,这决定了坐标轴的方向和位置,通过view函数实现视点的设置:view([z y ]):(将坐标系统想象为一座房子,而自己是个会飞的天使 ...
- 简单而粗暴的方法画任意阶数Bezier曲线
简单而粗暴的方法画任意阶数Bezier曲线 虽然说是任意阶数,但是嘞,算法原理是可以到任意阶数,计算机大概到100多阶就会溢出了 Bezier曲线介绍] [本文代码] 背景 在windows的Open ...
- thinkphp3.2 cli模式的正确使用方法
最近要使用thinkphp3.2版本的cli模式,手动执的话没有问题,比如php /www/index.php home/article/get 这样没有问题,但是一般用cli模式都是定时任务比较多, ...
- Linux重启inotify配置max_user_watches无效被恢复默认值8192的正确修改方法
Linux下Rsync+inotify-tools实现数据实时同步中有一个重要的配置就是设置Inotify的max_user_watches值,如果不设置,当遇到大量文件的时候就会出现出错的情况. 一 ...
- MyEclipse10的正确破解方法
无法转载,故给出原文链接,以供需要者. MyEclipse10的正确破解方法
- Matplotlib学习---用seaborn画直方图,核密度图(histogram, kdeplot)
由于直方图受组距(bin size)影响很大,设置不同的组距可能会产生完全不同的可视化结果.因此我们可以用密度平滑估计来更好地反映数据的真实特征.具体可参见这篇文章:https://blog.csdn ...
- [转]MySQL忘记密码的正确解决方法
http://database.51cto.com/art/201005/201986.htm 以下的文章主要介绍的是MySQL忘记密码的正确解决方法,在实际操作中如果你忘记MySQL密码是一件很头痛 ...
- webpack快速入门——实战技巧:watch的正确使用方法,webpack自动打包
随着项目大了,后端与前端联调,我们不需要每一次都去打包,这样特别麻烦,我们希望的场景是,每次按保存键,webpack自动为我们打包,这个工具就是watch! 因为watch是webpack自带的插件, ...
- .Net core 下的ConfigurationManager类正确引用方法
大家在项目中经常会用到需要引用配置文件的情况,这也是我偶然间遇到的问题,菜鸟一枚,如有需纠正多谢指点. 正题 在不先引用using的情况下直接写 ConfigurationManager.AppSet ...
随机推荐
- ql的python学习之路-day4
集合(set) 集合主要有两种用处: 1.去除相同的元素 2.关系测试,两个列表中的元素的关系 按照‘alex’讲的自己写了源码笔记,下面就直接贴出来: #!/usr/bin/env python # ...
- pssh远程执行命令的利器
pssh -h hosts.txt -l irb2 -o /tmp/foo uptime -l 后面加用户,很好理解,执行uptime,然后把结果写入/tmp/foo目录. pscp -h hosts ...
- XShell 评估到期
刚刚打开XShell弹出”评估到期“,点击确定后自动打开中文官网,得购买后才能使用. 当初下载的时候没留意到会有这一天.. 手头拮据的朋友可以通过下面方法绕过: 删除XShell. 到英文官网下载页找 ...
- jquery 滚轴滚动 导航定位和锚点定位
自己写的,只测试了ie9+, firefox,chrome 以下js更好 var fixbar={ init:function(){ "use strict"; // 滚轴 导航位 ...
- ie ajax 跨域情况遇到的各种问题
jQuery.support.cors = true; http://blog.csdn.net/jupiter37/article/details/25694289 jQuery ajax跨域调用出 ...
- CentOS7搭建Java环境(JDK、MySQL和Tomcat)
目录 安装jdk 准备 jdk环境配置流程 安装MySQL 5.6 准备 MySQL安装流程 安装Tomcat 7 准备 Tomcat安装流程 参考链接 安装jdk 准备 jdk的tar.gz包(本文 ...
- eclipse——管理远程资源的缓存,例如从Internet下载的资源。
原文:Manage the cache of remote resources,such as those downloaded from the internet.
- JS 写逻辑判断,不要只知道用 if-else 和 switch
我们在编写 JS 代码时,经常会遇到逻辑判断复杂的情况.一般情况下,可以用 if/else 或 switch 来实现多个条件判断,但会出现一个问题:随着逻辑复杂度的增加,代码中的 if/else 和 ...
- Kubernetes学习笔记(八):Deployment--声明式的升级应用
概述 本文核心问题是:如何升级应用. 对于Pod的更新有两种策略: 一是删除全部旧Pod之后再创建新Pod.好处是,同一时间只会有一个版本的应用存在:缺点是,应用有一段时间不可用. 二是先创建新Pod ...
- Linux学习(一):常用命令
init 0:关机 init 3:命令行模式 init 5:图形界面模式 init 6:重启 shutdown -h now:立马关机 ls:文件列表 参数:-l 详细列表 cd:切换目录 用法实例: ...