Python数据可视化:箱线图多种库画法

概念

箱线图通过数据的四分位数来展示数据的分布情况。例如:数据的中心位置,数据间的离散程度,是否有异常值等。

把数据从小到大进行排列并等分成四份,第一分位数(Q1),第二分位数(Q2)和第三分位数(Q3)分别为数据的第25%,50%和75%的数字。

四分位间距(Interquartilerange(IQR))=上分位数(upper quartile)-下分位数(lower quartile)

箱线图分为两部分,分别是箱(box)和须(whisker)。箱(box)用来表示从第一分位到第三分位的数据,须(whisker)用来表示数据的范围。

箱线图从上到下各横线分别表示:数据上限(通常是Q3+1.5IQR),第三分位数(Q3),第二分位数(中位数),第一分位数(Q1),数据下限(通常是Q1-1.5IQR)。有时还有一些圆点,位于数据上下限之外,表示异常值(outliers)。

(注:如果数据上下限特别大,那么whisker将显示数据的最大值和最小值。)

案例

1. 使用pandas自带的函数

使用pandas里的dataframe数据结构存放待显示的数据。如果希望显示的各个数据列表中,数据长度不一致,可以先用Series函数转换为Series数据,再存储到dataframe中,对应index的value值若不存在则为NaN。

下面我们随机生成4组数据,看看他们的箱线图。

【代码】

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
def list_generator(mean, dis, number): # 封装一下这个函数,用来后面生成数据
 return np.random.normal(mean, dis * dis, number) # normal分布,输入的参数是均值、标准差以及生成的数量
# 我们生成四组数据用来做实验,数据量分别为70-100
y1 = list_generator(0.8531, 0.0956, 70)
y2 = list_generator(0.8631, 0.0656, 80)
y3 = list_generator(0.8731, 0.1056, 90)
y4 = list_generator(0.8831, 0.0756, 100)
# 如果数据大小不一,记得需要下面语句,把数组变为series
y1 = pd.Series(np.array(y1))
y2 = pd.Series(np.array(y2))
y3 = pd.Series(np.array(y3))
y4 = pd.Series(np.array(y4))
data = pd.DataFrame({"1": y1, "2": y2, "3": y3, "4": y4, })
data.boxplot() # 这里,pandas自己有处理的过程,很方便哦。
plt.ylabel("ylabel")
plt.xlabel("xlabel") # 我们设置横纵坐标的标题。
plt.show() 

【效果】

上面的箱线图很简单,给出数据后,几行代码就能生成,不过这是简单的箱线图。下面再看看稍微复杂点的。

2. 使用matplotlib库画箱线图

我们上面介绍了使用pandas画箱线图,几句命令就可以了。但是稍微复杂点的可以使用matplotlib库。matplotlib代码稍微复杂点,但是很灵活。细心点同学会发现pandas里面的画图也是基于此库的,下面给你看看pandas里面的源码:

通过源码可以看到pandas内部也是通过调用matplotlib来画图的。那下面我们自己实现用matplotlib画箱线图。

我们简单模拟一下,男女生从20岁,30岁的花费对比图,使用箱线图来可视化一下。

【代码】

import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots() # 子图
def list_generator(mean, dis, number): # 封装一下这个函数,用来后面生成数据
 return np.random.normal(mean, dis * dis, number) # normal分布,输入的参数是均值、标准差以及生成的数量 

# 我们生成四组数据用来做实验,数据量分别为70-100
# 分别代表男生、女生在20岁和30岁的花费分布
girl20 = list_generator(1000, 29.2, 70)
boy20 = list_generator(800, 11.5, 80)
girl30 = list_generator(3000, 25.1056, 90)
boy30 = list_generator(1000, 19.0756, 100) 

data=[girl20,boy20,girl30,boy30,]
ax.boxplot(data)
ax.set_xticklabels(["girl20", "boy20", "girl30", "boy30",]) # 设置x轴刻度标签
plt.show() 

【效果】

从上面随机模拟,看出来男生花费赶不上女生吧,尤其是30岁以后,女生摔男生一大截啊。(模拟数据,请勿当真)

仔细看上面的图,感觉还是不太好,既然男女生对比,那是不是要分组,男女生放一块,然后再根据年龄段比较,这样比较才直观。

那我们就稍微改动上面一点点代码,实现男女生箱线图挨得近一点。

【代码】

import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots() # 子图
def list_generator(mean, dis, number): # 封装一下这个函数,用来后面生成数据
 return np.random.normal(mean, dis * dis, number) # normal分布,输入的参数是均值、标准差以及生成的数量 

# 我们生成四组数据用来做实验,数据量分别为70-100
# 分别代表男生、女生在20岁和30岁的花费分布
girl20 = list_generator(1000, 29.2, 70)
boy20 = list_generator(800, 11.5, 80)
girl30 = list_generator(3000, 25.1056, 90)
boy30 = list_generator(1000, 19.0756, 100) 

data=[girl20,boy20,girl30,boy30,]
# 用positions参数设置各箱线图的位置
ax.boxplot(data,positions=[0, 0.6, 3, 3.7,])# 就是后面加了位置
ax.set_xticklabels(["girl20", "boy20", "girl30", "boy30",]) # 设置x轴刻度标签
plt.show() 

【效果】

这样看一下,是不是男女生根据年龄段分组了呢,稍微比上面好看些,也直观一些。这样既能看出年龄段的对比,又能看出男女生的对比。

同样,如果想要箱线图旋转90°,那么也是在在 boxplot命令里加上参数 vert=False即可。如果想要更多设置,可以基于 boxplot函数参数进行修改,其函数定义如下:

boxplot(self, x, notch=None, sym=None, vert=None, whis=None,
 positions=None, widths=None, patch_artist=None,
 bootstrap=None, usermedians=None, conf_intervals=None,
 meanline=None, showmeans=None, showcaps=None,
 showbox=None, showfliers=None, boxprops=None,
 labels=None, flierprops=None, medianprops=None,
 meanprops=None, capprops=None, whiskerprops=None,
 manage_xticks=True, autorange=False, zorder=None)

3. 使用seaborn库和matplotlib来画箱线图

Seaborn是基于matplotlib的Python可视化库。 它提供了一个高级界面来绘制有吸引力的统计图形。Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,不需要经过大量的调整就能使你的图变得精致。但应强调的是,应该把Seaborn视为matplotlib的补充,而不是替代物。

函数定义:

boxplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None,
 orient=None, color=None, palette=None, saturation=.75,
 width=.8, dodge=True, fliersize=5, linewidth=None,
 whis=1.5, notch=False, ax=None, **kwargs) 

【参数讲解】 x,y:dataframe中的列名(str)或者矢量数据

  • data:dataframe或者数组
  • palette:调色板,控制图像的色调
  • hue(str):dataframe的列名,按照列名中的值分类形成分类的条形图
  • order, hue_order (lists of strings):用于控制条形图的顺序
  • orient:"v"|"h" 用于控制图像使水平还是竖直显示(这通常是从输入变量的dtype推断出来的,此参数一般当不传入x、y,只传入data的时候使用)
  • fliersize:float,用于指示离群值观察的标记大小
  • whis:确定离群值的上下界(IQR超过低和高四分位数的比例),此范围之外的点将被识别为异常值。IQR指的是上下四分位的差值。
  • width:float,控制箱型图的宽度

我们还是基于上面男女花费案例来说,不过这里我们把数据进行了整理,做成了数据框dataframe。

【包含的库】

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# plt.rc("font", family="SimHei", size="15") 避免中文乱码,可不用

【代码第一部分】数据生成

def list_generator(mean, dis, number): # 封装一下这个函数,用来后面生成数据
 return np.random.normal(mean, dis * dis, number) # normal分布,输入的参数是均值、标准差以及生成的数量 

# 我们生成四组数据用来做实验,数据量分别为70-100
# 分别代表男生、女生在20岁和30岁的花费分布
# 构造数据库DataFrame
num = 100 # 每组100个样本
girl20 = list_generator(1000, 29.2, num)
boy20 = list_generator(800, 11.5, num)
girl30 = list_generator(3000, 25.1056, num)
boy30 = list_generator(1000, 19.0756, num)
girl_sex = ['female' for _ in range(num)]
boy_sex = ['male' for _ in range(num)]
age20 = [20 for _ in range(num)]
age30 = [30 for _ in range(num)] 

girl_d1 = pd.DataFrame({'cost': girl20, 'sex': girl_sex, 'age': age20})
boy_d1 = pd.DataFrame({'cost': boy20, 'sex': boy_sex, 'age': age20})
girl_d2 = pd.DataFrame({'cost': girl30, 'sex': girl_sex, 'age': age30})
boy_d2 = pd.DataFrame({'cost': boy30, 'sex': boy_sex, 'age': age30})
data = pd.concat([girl_d1, boy_d1, girl_d2, boy_d2]) 

print(data.head()) 

数据长啥样?下面是给出的数据框前面的部分,一共400个样本,分性别和年龄。

【代码第二部分】使用seaborn库画图

简单看看所有数据的分布情况:

sns.boxplot(x="age", y="cost", data=data, hue="sex", width=0.5, linewidth=1.0, palette="Set3") 

根据性别分组:

sns.boxplot(x="age", y="cost", data=data, hue="sex", width=0.5, linewidth=1.0, palette="Set3") 

根据年龄分组:

sns.boxplot(x="sex", y="cost", data=data, hue="age", width=0.5, linewidth=1.0, palette="Set3") 

上面这些是seaborn库的简单使用,可以通过年龄看男女花费比较,也可以根据性别看不同年龄段的花费比较,还是比较直观的。当然除此之外还有很多其他的炫技,大家可以自己尝试。

总结

从上面来看,虽然我们是采用不同方法来画箱线图,但是最基本的都是调用matplotlib库,这里面pandas是最简单的箱线图可视化,但是不灵活。而matplotlib虽然灵活,但是需要慢慢调,而且复杂。相比之下seaborn更加酷炫,而且图还更好看。上面例子都是本人亲测,一个个对比,原创文章,大家如果有其他问题可以留言讨论。

(0)

相关推荐

  • 利用Python代码实现数据可视化的5种方法详解

    前言 数据科学家并不逊色于艺术家.他们用数据可视化的方式绘画,试图展现数据内隐藏的模式或表达对数据的见解.更有趣的是,一旦接触到任何可视化的内容.数据时,人类会有更强烈的知觉.认知和交流. 数据可视化是数据科学家工作中的重要组成部分.在项目的早期阶段,你通常会进行探索性数据分析(Exploratory Data Analysis,EDA)以获取对数据的一些理解.创建可视化方法确实有助于使事情变得更加清晰易懂,特别是对于大型.高维数据集.在项目结束时,以清晰.简洁和引人注目的方式展现最终结果是非常

  • 基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解

    Pyplot matplotlib.pyplot是一个命令型函数集合,它可以让我们像使用MATLAB一样使用matplotlib.pyplot中的每一个函数都会对画布图像作出相应的改变,如创建画布.在画布中创建一个绘图区.在绘图区上画几条线.给图像添加文字说明等.下面我们就通过实例代码来领略一下他的魅力. import matplotlib.pyplot as plt plt.plot([1,2,3,4]) plt.ylabel('some numbers') plt.show() 上图是我们通

  • Python Pandas 箱线图的实现

    各国家用户消费分布 import numpy as np import pandas as pd import matplotlib.pyplot as plt data = { 'China': [1000, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2500], 'America': [1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100], 'Britain': [1000

  • 以911新闻为例演示Python实现数据可视化的教程

    本文介绍一个将911袭击及后续影响相关新闻文章的主题可视化的项目.我将介绍我的出发点,实现的技术细节和我对一些结果的思考. 简介 近代美国历史上再没有比911袭击影响更深远的事件了,它的影响在未来还会持续.从事件发生到现在,成千上万主题各异的文章付梓.我们怎样能利用数据科学的工具来探索这些主题,并且追踪它们随着时间的变化呢? 灵感 首先提出这个问题的是一家叫做Local Projects的公司,有人委任它们为纽约的国家911博物馆设置一个展览.他们的展览,Timescape,将事件的主题和文章可

  • 利用Python绘制MySQL数据图实现数据可视化

    本教程的所有Python代码可以在网上的IPython notebook中获取. 考虑在公司里使用Plotly?可以看一下Plotly的on-premises企业版.(注:On-premises是指软件运行在工作场所或公司内部,详见维基百科) 注意操作系统:尽管Windows或Mac用户也可以跟随本文操作,但本文假定你使用的是Ubuntu系统(Ubuntu桌面版或Ubuntu服务器版).如果你没有Ubuntu Server,你可以通过Amazon的Web服务建立一个云平台(阅读这份教程的前半部分

  • Python数据可视化正态分布简单分析及实现代码

    Python说来简单也简单,但是也不简单,尤其是再跟高数结合起来的时候... 正态分布(Normaldistribution),也称"常态分布",又名高斯分布(Gaussiandistribution),最早由A.棣莫弗在求二项分布的渐近公式中得到.C.F.高斯在研究测量误差时从另一个角度导出了它.P.S.拉普拉斯和高斯研究了它的性质.是一个在数学.物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力. 正态曲线呈钟型,两头低,中间高,左右对称因其曲线呈钟形,因此人

  • 利用Python进行数据可视化常见的9种方法!超实用!

    前言 如同艺术家们用绘画让人们更贴切的感知世界,数据可视化也能让人们更直观的传递数据所要表达的信息. 我们今天就分享一下如何用 Python 简单便捷的完成数据可视化. 其实利用 Python 可视化数据并不是很麻烦,因为 Python 中有两个专用于可视化的库 matplotlib 和 seaborn 能让我们很容易的完成任务. Matplotlib:基于Python的绘图库,提供完全的 2D 支持和部分 3D 图像支持.在跨平台和互动式环境中生成高质量数据时,matplotlib 会很有帮助

  • 举例讲解Python的Tornado框架实现数据可视化的教程

    所用拓展模块     xlrd: Python语言中,读取Excel的扩展工具.可以实现指定表单.指定单元格的读取.     使用前须安装.     下载地址:https://pypi.python.org/pypi/xlrd     解压后cd到解压目录,执行 python setup.py install 即可 datetime: Python内置用于操作日期时间的模块 拟实现功能模块 读xls文件并录入数据库 根据年.月.日三个参数获取当天的值班情况 饼状图(当天完成值班任务人数/当天未完

  • Python数据可视化:箱线图多种库画法

    概念 箱线图通过数据的四分位数来展示数据的分布情况.例如:数据的中心位置,数据间的离散程度,是否有异常值等. 把数据从小到大进行排列并等分成四份,第一分位数(Q1),第二分位数(Q2)和第三分位数(Q3)分别为数据的第25%,50%和75%的数字. 四分位间距(Interquartilerange(IQR))=上分位数(upper quartile)-下分位数(lower quartile) 箱线图分为两部分,分别是箱(box)和须(whisker).箱(box)用来表示从第一分位到第三分位的数

  • Python数据可视化实现漏斗图过程图解

    项目实现知识点: Pandas库及pyecharts库 Pandas:数据分析和处理工具. pd.read_csv():读取csv文件. pyecharts:绘图库,提供30多种图标,超过400个以上的地图文件,支持原生百度地图,为地理数据可视化提供支持. pyecharts.charts:提供了基本的图表,例如条形图.直方图等. Python数据可视化:漏斗图的制作 项目实现过程: 1.导入模块 2.打开文件 3.读取数据 4.整理数据 5.创建漏斗图 6.添加组件 7.显示漏斗并设置名称 8

  • Python pyecharts Boxplot箱线图的实现

    本篇博客只是单纯的记录一下自己学习Boxplot,没有过多的解释,官网:>>Boxplot import seaborn as sns import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt %matplotlib inline plt.rcParams['font.sans-serif']=['Microsoft YaHei'] # 用来正常显示中文标签 p

  • Python数据可视化:饼状图的实例讲解

    使用python实现论文里面的饼状图: 原图: python代码实现: # # 饼状图 # plot.figure(figsize=(8,8)) labels = [u'Canteen', u'Supermarket', u'Dorm', u'Others'] sizes = [73, 21, 4, 2] colors = ['red', 'yellow', 'blue', 'green'] explode = (0.05, 0, 0, 0) patches, l_text, p_text =

  • Python数据可视化之环形图

    目录 1.引言 2.方式一:饼图形式 3.方式二:条形图形式 1.引言 环形图(圆环)在功能上与饼图相同,整个环被分成不同的部分,用各个圆弧来表示每个数据所占的比例值.但其中心的空白可用于显示其他相关数据展示,相比于标准饼图提供了更丰富的数据信息输出. 在本文中,我们将介绍 Matplolib中绘制圆环图的两种方法.使用饼图和参数wedgeprops 的简单方法,以及使用极轴和水平条形图的复杂方法. 2.方式一:饼图形式 在 Matplotlib 中没有绘制圆环图的直接方法,但我们可以使用饼图中

  • python数据可视化绘制火山图示例

    目录 导入模块 1.读取测试数据 2.查看数据 3.筛选差异基因 4.查看数据,发现多了type这一列 5.统计个数 6.绘火山图 7.保存图片 导入模块 import numpy as np import pandas as pd 1.读取测试数据 data=pd.read_csv(r'E:\ZYH\R.project\rna-seq\lianxi1\exon_level\df.csv') 2.查看数据 data.head() 3.筛选差异基因 # 3.尝试写循环筛选上下调基因分类赋值给 "u

  • Python Matplotlib绘制箱线图boxplot()函数详解

    目录 箱线图 boxplot()函数还提供了丰富的自定义选项 箱线图通常用在多组数据比较时 补充:plt.boxplot()函数绘制箱图.常用方法 实战 常用方法 总结 箱线图 箱线图一般用来展现数据的分布,如上下四分位值.中位数等,也可以直观地展示异常点.Matplotlib提供了boxplot()函数绘制箱线图. import matplotlib.pyplot as plt _ = plt.boxplot(range(10)) # 10个数,0-9 plt.show() 箱线图虽然看起来简

  • Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解

    python可以在处理各种数据时,如果可以将这些数据,利用图表将其可视化,这样在分析处理起来,将更加直观.清晰,以下是 利用 PyEcharts 常用图表的可视化Demo, 开发环境 python3 柱状图 基本柱状图 from pyecharts import Bar # 基本柱状图 bar = Bar("基本柱状图", "副标题") bar.use_theme('dark') # 暗黑色主题 bar.add('真实成本', # label ["1月&q

  • Python数据可视化Pyecharts库实现桑葚图效果

    目录 基本思路我总结大概有三步: 1. 先申明使用sankey 2. 使用add 添加对sankey图的配置信息 3. 最后render生成html文件展示 首先介绍一下什么是桑葚图? 桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图. 它是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,通常应用于能源.材料成分.金融等数据的可视化分析. 因1898年Matthew Henry Phineas Riall Sankey绘制的"蒸汽机的能源效率图"

  • 学会Python数据可视化必须尝试这7个库

    目录 一.Seaborn 二.Plotly 三.Geoplotlib 四.Gleam 五.ggplot 六.Bokeh 七.Missingo 一.Seaborn Seaborn 建于 matplotlib 库的之上.它有许多内置函数,使用这些函数,只需简单的代码行就可以创建漂亮的绘图.它提供了多种高级的可视化绘图和简单的语法,如方框图.小提琴图.距离图.关节图.成对图.热图等. 安装 ip install seaborn 主要特征: 可用于确定两个变量之间的关系. 在分析单变量或双变量分布时进行

随机推荐