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 ...
随机推荐
- DPDK开发环境搭建(学会了步骤适合各版本)
一.版本的选择 首先要说明的是,对于生产来说DPDK版本不是越高越好,如何选择合适的版本? 1.要选择长期支持的版本LTS(Long Term Support) 2.根据当前开发的系统环境选择 可以在 ...
- BATJ解决千万级别数据之MySQL 的 SQL 优化大总结
引用 在数据库运维过程中,优化 SQL 是 DBA 团队的日常任务.例行 SQL 优化,不仅可以提高程序性能,还能减低线上故障的概率. 目前常用的 SQL 优化方式包括但不限于:业务层优化.SQL 逻 ...
- 转 vue过滤器使用
简单介绍一下过滤器,顾名思义,过滤就是一个数据经过了这个过滤之后出来另一样东西,可以是从中取得你想要的,或者给那个数据添加点什么装饰,那么过滤器则是过滤的工具.例如,从['abc','abd','ad ...
- Layui 解决动态图标不动的问题
<i class="layui-icon layui-icon-face-smile" style="color: red; font-size: 100px;&q ...
- Verilog代码和FPGA硬件的映射关系(二)
大家可能会有这样的疑问,我们编写的Verilog代码最终会在FPGA上以怎样的映射关系来实现功能呢?我们以一个最简单的组合逻辑与门为例来向大家说明.RTL代码如下所示: //------------- ...
- pip命令报错“no perl script found in input”
windows10,命令行下使用pip命令时报错,python运行成功,且环境变量已经设置,可能是更新了新版本pip所导致 解决方案: 一.使用pip.exe+命令可解决这个问题 二.进行python ...
- UIAutomator2的API文档(一)
检查并维持设备端守护进程处于运行状态,应该是重启了atx守护进程:d.healthcheck() 1.隐式等待 import uiautomator2 as u2serialno = '7f3dec6 ...
- Spring笔记 - 组件注册
@Bean:类注入容器 xml方式: <bean id="person" class="com.hrh.bean.Person"> <prop ...
- CSS综合案例
代码示例:新闻页面: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- Springboot整合MybatisPlus(超详细)完整教程~
新建springboot项目 开发工具:idea2019.2,maven3 pom.xml <dependency> <groupId>org.springframework. ...