Python的seaborn和matplotlib作图之barplot条形图高级实战DIY技巧详解

前言

Python的seaborn和matplotlib作图之barplot条形图高级实战DIY技巧详解
昨天在浏览www.hltv.org网站的csgo选手数据时看到了这样一幅图,图上包含有选手的六项数据,分别为KPR(平均每回合击杀),DPR(平均每回合死亡),KAST(助攻综合百分比),IMPACT(影响力),ADR(平均每回合输出),Rating 2.0(综合得分),从这图上可以看出KPR,DPR,IMPACT和RATING2.0为同一类型的输出(保留两位小数),KAST以百分比输出,ADR的范围在0到100多之间, 它们是不同量纲的数据,但是图上却有一条灰色的平均线,同时, 数据的大小影响到了该数据条的颜色,这样的图是怎么画出来的呢?能不能用python的Seaborn画出这样的图呢?

; 流程

作图之前,我们需要先弄清楚, 默认的作图和我们想要的作图之间到底存在什么样的 不同之处?
看官网示例的作图:

Python的seaborn和matplotlib作图之barplot条形图高级实战DIY技巧详解
第一,Y轴的额外标签(total_bill)和X轴的额外标签(day)应该去掉。
第二,Y轴的刻度标签应该去掉(0,5,10,15,20)。
第三,每个条形图上方应该存在数据标签而不是黑色竖直误差条。
第四,背景的刻度线应该淡化,Y轴该去掉刻度。
第五,应该存在一条共同的平均线,同时添加上文字标签放置在灰色线条的左侧。
第六,根据数值大小进行颜色变换。

关于 第五点,我们可以看出这条共同的平均线其实可以用 标准化后的各项数据表示,什么意思呢?进行正态变换,正态化后 平均数=0,不就有共同的标准线了吗?同时 第六点也有了解决思路,那就是比如高于一个标准差,高于两个标准差,高于三个标准差分别用不同的颜色。

seaborn.barplot(*, x=None, y=None, hue=None, data=None, order=None, hue_order=None,
estimator=<function mean at 0x7fecadf1cee0>,
ci=95, n_boot=1000, units=None, seed=None, orient=None,
color=None, palette=None, saturation=0.75, errcolor='.26', errwidth=None,
capsize=None, dodge=True, ax=None, **kwargs)

官网中对于seaborn这个画图的函数有许多参数可以定义,在这里我们只关注x,y,hue,data这三个参数,这里我们先把数据准备成官网范例中输入的DateFrame样式。

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.DataFrame()
df['data']=[2.67129444, 1.24857579, 2.11691103, 2.92484313, 2.80181327,3.1691944]
df['skill']=['KPR','DPR','KAST','IMPACT','ADR','Rating 2.0']
df['Category']=[1,0,1,1,1,2]
df

运行后得到以下输出:

Python的seaborn和matplotlib作图之barplot条形图高级实战DIY技巧详解

第一列为已经标准化后的数据y,第二列为我们要的标签名x,第三列是我们定义好的类别轴hue,这里方便演示把高于一个标准差小于两个设为0,高于两个设为1,高于三个设为2。我们先按照官网示例的方法输入以下代码:

sns.barplot(x='skill',y='data',hue='Category',data = df , palette='Blues',dodge=False)

这里传入参数的时候有个data = df,表示传入我们要用的数据框(DataFrame),x,y,hue则以 取列名的方式传入参数,其实等同于x=df[‘skill’],传入了一个Series。在这种情况下作图得出的结果:

Python的seaborn和matplotlib作图之barplot条形图高级实战DIY技巧详解
会带有额外标签data和skill,显然不是我们想要的结果。如何去掉?这里我们只需要传入单纯的数组(array)就可以了。
sns.barplot(x=df['skill'].values,y=df['data'].values,hue=df['Category'].values,palette='Blues',dodge=False)

当一个Series加上.values属性,取出来的数值就是单纯的array,如下:

Python的seaborn和matplotlib作图之barplot条形图高级实战DIY技巧详解
Python的seaborn和matplotlib作图之barplot条形图高级实战DIY技巧详解
X轴和Y轴的额外标签没有了!
在此,我们已经完成了 第六点(通过hue这个类别轴属性)和 第一点(画图时传入数组而非Series),但是也多出了一点,那就是一个莫名其妙跟随类别轴出现的图例。
不过接下来,我们先看 第四点,背景的刻度线淡化以及Y轴去掉刻度。
等等,这图上也没有刻度线啊??
别急,首先需要对它的整体布局进行一个调整,
sns.set(style="whitegrid")

这个style可以有白色带网格(我们要的),黑色带网格,白色不带网格,黑色不带网格四种,具体英文名搜一下都有这里不赘述了。效果如下:

Python的seaborn和matplotlib作图之barplot条形图高级实战DIY技巧详解
有了刻度线,就可以进行淡化和Y轴去刻度问题了,我们用matplotlib库的一个功能即可解决:
plt.tick_params(labelleft=False,grid_alpha=0.2)

tick_params包含很多可选参数,这里我们传入labelleft=False,表示左侧的刻度关闭,如果想更改其他方向同理把left换成right,bottom,top就行。grid_aplha表示刻度线透明度,这里我们设定为0.2,效果如下:

Python的seaborn和matplotlib作图之barplot条形图高级实战DIY技巧详解
怎么样,很接近了对吗,但是这个 边框它没有消失啊,没关系,用Seaborn的despine函数即可解决:
sns.despine(top=True, right=True, left=True, bottom=True)

在这个参数中我们把 上边,右边,左边,下边四个方向的轴全部设置为 True,就去掉了它。

Python的seaborn和matplotlib作图之barplot条形图高级实战DIY技巧详解
接下来去除图中目前最碍眼的部分即 图例
ax = plt.legend()  #&#x83B7;&#x53D6;&#x56FE;&#x4E2D;&#x7684;&#x56FE;&#x4F8B;&#x4E3A;ax
ax.remove()        #&#x8C03;&#x7528;remove&#x65B9;&#x6CD5;&#x53BB;&#x9664;

Python的seaborn和matplotlib作图之barplot条形图高级实战DIY技巧详解
现在只剩下第三点和第五点了,添加数据标签和一条带标签的灰色横线,它们都共同用到了plt.text方法添加文字标签,先添加带标签的灰色横线:
df['data']=df['data']+1
plt.axhline(y=1,ls="-", lw=2, c="darkgrey")
plt.text(-1,1,"Avg")

在说明之前需要明白,我们这里的平均线实际上是0,但我们不能把它画在X轴,看不到,那么一个好的方法就是 把我们的df的data数据先全加上1,再把平均值设为1
plt.axhline方法画了一条横向的直线,这里在y=1处画,设置线条属性为”-“形状,宽度为2,颜色为深灰的直线。
plt.text方法生成了一个在x=-1,y=1处的文字标签,我们把它命名为”Avg”。
效果如下:

Python的seaborn和matplotlib作图之barplot条形图高级实战DIY技巧详解
接下来规范化输出数据标签,前面也提过量纲不同,所以需要输出标准化之前不同的 原始数据值
df1 = pd.Series([1.942354,0.370536,0.997880,1.400000,180.000000,1.437307]) #&#x539F;&#x59CB;&#x6570;&#x636E;
for x,y in zip((0,1,3,5),(0,1,3,5)):
    plt.text(x-0.2,df['data'][y]+0.08,'{:.2f}'.format(df1[y]),color = 'black')  #&#x4FDD;&#x7559;&#x4E24;&#x4F4D;&#x5C0F;&#x6570;
plt.text(1.7,df['data'][2]+0.08,'{:.2%}'.format(df1[2]),color = 'black')  #&#x4FDD;&#x7559;&#x4E24;&#x4F4D;&#x5C0F;&#x6570;&#x540C;&#x65F6;&#x767E;&#x5206;&#x53F7;&#x8F93;&#x51FA;
plt.text(3.85,df['data'][4]+0.08,int(df1[4]),color = 'black')             #&#x6574;&#x6570;&#x8F93;&#x51FA;

plt.text函数前两个参数是坐标值,这里我们需要一个合适的美观的坐标值,x轴就根据1,2,3,4,5的特殊位置进行调整,y轴就根据每列的Y值再往上一点点就可以,color属性设置文字颜色,这里用黑色。由于KPR(0),DPR(1),IMPACT(3),Rating2.0(5)的轴是同一种输出方式,所以就用循环进行处理,再单独处理KAST(2)和ADR(4)就可以了。
结果如下:

Python的seaborn和matplotlib作图之barplot条形图高级实战DIY技巧详解
最后一步,也就是看个人喜好的一步,调整颜色板:
sns.barplot(x=df['skill'].values,y=df['data'].values,hue=df['Category'].values,palette='Blues',dodge=False)

也就是其中的palette参数,这里我用的是蓝色’Blues’,如果想反转颜色变化方向就用’Blues_r’,此外还有sns.color_palette(),sns.cubehelix_palette()等多种色板可以调整。
比如:

palette1 = sns.color_palette("pastel") #&#x5EFA;&#x7ACB;&#x4E00;&#x4E2A;&#x8C03;&#x8272;&#x677F;
sns.barplot(x=df['skill'].values,y=df['data'].values,hue=df['Category'].values,palette=palette1,dodge=False)

只需要先建立一个调色板,再把它传入palette参数就可以了,效果如下:

Python的seaborn和matplotlib作图之barplot条形图高级实战DIY技巧详解

总结

临时起意作图,经过了上百次调试之后不仅对pandas的数据结构有了更深刻的理解,也学会了很多作图的新技巧,本文所用的function总结如下:
sns.barplot(x,y,hue,palette,dodge)
sns.set(style)
plt.tick_params(labelleft,grid_alpha)
sns.despine(top,right,left,bottom)
plt.legend().remove()
plt.axhline(y,ls,lw,c)
plt.text(x,y,label,color)
你学会了吗?

Original: https://blog.csdn.net/weixin_43945848/article/details/114659606
Author: XINFINFZ
Title: Python的seaborn和matplotlib作图之barplot条形图高级实战DIY技巧详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/767060/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • pytest框架使用示例

    import pytest def test_1(): assert 1 == 1 def atest_1(): print(123) assert 1 == 1 def test…

    Python 2023年9月9日
    040
  • Flask-04(一、项目结构搭建 二、导航条实现 三、登录和注册页面 四、发送邮件功能 五、验证码的存储)

    文章目录 一、项目结构搭建 二、导航条实现 三、登录和注册页面 四、发送邮件功能 五、验证码的存储 一、项目结构搭建 所有结构用到的文件:app.py跑起来的主程序 from fl…

    Python 2023年8月11日
    048
  • 十八、绘制游戏背景图片

    我们从今天开始研发 主要的游戏部分。前期我们学习了游戏的引入,最后再学习人工智能的项目。 为了方便我们学习,我可能会对项目进行一定的改动,不用管源代码是什么样。一定要注意,每次课最…

    Python 2023年9月22日
    037
  • 使用django+python开发的学生档案信息管理系统Vue源码

    本文首先介绍了设计的背景与研究目的,其次介绍系统相关技术Python,重点叙述了系统功能分析以及详细设计,最后总结了系统的开发心得。附有项目源码介绍 本次设计任务是要设计一个学生档…

    Python 2023年8月5日
    071
  • 用【Python】写了一个水果忍者小游戏,玩过之后爱不释手

    前言 水果忍者到家都玩过吧,但是Python写的水果忍者你肯定没有玩过。今天就给你表演一个新的,用Python写一个水果忍者。 水果忍者的玩法很简单,尽可能的切开抛出的水果就行。 …

    Python 2023年9月18日
    040
  • Python ❀ 文件与异常

    ​​1、文件中读取数据​​ ​​1.1 读取文件​​ ​​1.2 文件路径​​ ​​1.3 逐行读取​​ ​​1.4 创建一个包含文件各行内容的列表​​ ​​1.5 使用文件内容​…

    Python 2023年5月25日
    046
  • Python基础之Flask快速入门

    概述 当你爬取了很多数据,却无法展示,当你生成了漂亮图表,却不知如何给客户看,这是因为你缺少一个web项目。本文以一个简单的小例子,简述如何通过flask创建一个web项目,并成功…

    Python 2023年8月10日
    059
  • 关于git,你需要了解这些

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年10月7日
    055
  • python pandas笔记

    数据读取 可以读取excel,csv等: df = pd.read_excel("Name.xlsx") df = pd.read_csv("Name…

    Python 2023年8月6日
    048
  • 【python 问题解决】 —- UPX is not available.

    2. 错误原因 由于 pyinstaller 打包使用的是 UPX,打包时没找到这个应用,导致的报错! 3. 解决办法一 访问 UPX 官网下载:https://upx.githu…

    Python 2023年8月2日
    0101
  • [ Linux ] 设置开机自动登录

    https://www.cnblogs.com/yeungchie/ 查看桌面环境 file -L /etc/systemd/system/display-manager.serv…

    Python 2023年6月16日
    075
  • 一看就会的Pandas文本数据处理

    大家好,我是才哥。 日常工作中我们经常接触到一些文本类信息,需要从文本中解析出数据信息,然后再进行数据分析操作。 而对文本类信息进行解析是一件比较头秃的事情,好巧, Pandas刚…

    Python 2023年8月8日
    064
  • MAE详解

    目录 一、介绍 二、网络结构 1. encoder 2. decoder 3. LOSS 三、实验 全文参考:论文阅读笔记:Masked Autoencoders Are Scal…

    Python 2023年10月27日
    021
  • 详解蓝牙模块的分类

    摘要:蓝牙模块,是一种集成蓝牙功能的PCBA板,用于短距离无线通讯,蓝牙模块将芯片和外围硬件电路集成到一个PCB上,开发出所需的内置程序实现蓝牙功能的设备。可以通过相关接口和MCU…

    Python 2023年10月13日
    069
  • 对抗自编码器(adversarial autoencoder)

    目录 前言 实验 1 导入必要库函数并设置随机数等配置 2 加载并可视化MNIST数据 3 模型定义 4 模型训练 5 随机正态分布数据生成MNIST合成数据 参考资料 前言 自编…

    Python 2023年9月15日
    047
  • pytest单元测试框架

    一、pytest是什么 pytest是一个使构建简单、可伸缩的使测试变得容易的框架 二、pytest的规则 .py文件要test_开头或_test结尾 测试类必须以Test开头,且…

    Python 2023年9月15日
    045
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球