前言
之前我大部分时间都在使用Python web框架在做数据的收集和存储(Data Capturing and Stroage);
而我们也可以基于这些数据,进一步地对这些数据进行数据清洗挖掘(Data Exploring and Cleaning)出来进行机器学习。
Seaborn简介
Seaborn是一个基于Matplotlib的数据可视化库。它提供了更高级的API帮助我们绘制出更具吸引力、信息丰富的统计图形,当然Seaborn对pandas的兼容也不错。
Seaborn还有一个比较有意思的功能就是它可以通过网络向远程服务器自动获取很多示例数据,以供我们进行数据分析。
1.加载seabron内置数据集
seaborn有很多可以参考的示例数据,我们可以使用sns.load_dataset()方法从远程数据仓库加载数据,也可以把数据存储到本地缓存起来。
import seaborn as sns,numpy as np,matplotlib as plt #seaborn中自带了很多可以参考的示例数据,我们可以使用load_dataset加载数据。 #load an example dataset from the online repository (requires internet). print(sns.get_data_home())#查看示例数据默认保存的路径 tips=sns.load_dataset(name="tips",cache=True,data_home="D:seaborn") print(tips)
2.设置seaborn样式
我们通过plt.rcParams可以设置图的字体和大小。
import seaborn as sns,numpy as np,matplotlib.pyplot as plt tips=sns.load_dataset("tips") #set_style:用来设置图表的美观样式 darkgrid, whitegrid, dark, white, ticks #rc:需要1个字典,用来设置样式,但并不能设置所有属性,只能设置外形相关 #style:设置表格的样式dict, None, or one of {darkgrid, whitegrid, dark, white, ticks} sns.set_style("darkgrid",rc={"font.family":"KaiTi"}) plt.rcParams["font.family"]="Microsoft YaHei" plt.rcParams["figure.figsize"]=(10,6) line_fig=sns.lineplot(data=tips,x="size", y="total_bill") line_fig.set_title("小费") line_fig.set_xlabel('人数') line_fig.set_ylabel('金额') plt.show()
3.palette
You can refer to the range of colours that are used by a particular artist or group of artists as their palette.
现有一张柱状图,图中包含30根柱,我们如果设置这30根柱子为不同的颜色?这就需要palette。
也就是是说你得告诉seaborn要采用什么类型的画板?从这个画板里获取几种颜色?
import matplotlib.pyplot as plt import seaborn as sns """ 'CMRmap', 'CMRmap_r', 'Dark2', 'Dark2_r', 'GnBu', 'GnBu_r', 'Greens', 'Greens_r', 'Greys', 'Greys_r', 'OrRd', 'OrRd_r', 'Oranges', 'Oranges_r', 'PRGn', 'PRGn_r', 'Paired', 'Paired_r', 'Pastel1', 'Pastel1_r', 'Pastel2', 'Pastel2_r', 'PiYG', 'PiYG_r', 'PuBu', 'PuBuGn', 'PuBuGn_r', 'PuBu_r', 'PuOr', 'PuOr_r','PuRd', 'PuRd_r', 'Purples', 'Purples_r', 'RdBu', 'RdBu_r', 'RdGy', 'RdGy_r', 'RdPu', 'RdPu_r', 'RdYlBu', 'RdYlBu_r', 'RdYlGn', 'RdYlGn_r', 'Reds', 'Reds_r', 'Set1', 'Set1_r', 'Set2', 'Set2_r', 'Set3', 'Set3_r', 'Spectral', 'Spectral_r', 'Wistia', 'Wistia_r', 'YlGn', 'YlGnBu', 'YlGnBu_r', 'YlGn_r', 'YlOrBr', 'YlOrBr_r', 'YlOrRd', 'YlOrRd_r', 'afmhot', 'afmhot_r', 'autumn', 'autumn_r', 'binary', 'binary_r', 'bone', 'bone_r', 'brg', 'brg_r', 'bwr', 'bwr_r', 'cividis', 'cividis_r', 'cool', 'cool_r', 'coolwarm', 'coolwarm_r', 'copper', 'copper_r', 'crest', 'crest_r', 'cubehelix', 'cubehelix_r', 'flag', 'flag_r', 'flare', 'flare_r', 'gist_earth', 'gist_earth_r', 'gist_gray', 'gist_gray_r', 'gist_heat', 'gist_heat_r', 'gist_ncar', 'gist_ncar_r', 'gist_rainbow', 'gist_rainbow_r', 'gist_stern', 'gist_stern_r', 'gist_yarg', 'gist_yarg_r', 'gnuplot', 'gnuplot2', 'gnuplot2_r', 'gnuplot_r', 'gray', 'gray_r', 'hot', 'hot_r', 'hsv', 'hsv_r', 'icefire', 'icefire_r', 'inferno', 'inferno_r', 'jet', 'jet_r', 'magma', 'magma_r', 'mako', 'mako_r', 'nipy_spectral', 'nipy_spectral_r', 'ocean', 'ocean_r', 'pink', 'pink_r', 'plasma', 'plasma_r', 'prism', 'prism_r', 'rainbow', 'rainbow_r', 'rocket', 'rocket_r', 'seismic', 'seismic_r', 'spring', 'spring_r', 'summer', 'summer_r', 'tab10', 'tab10_r', 'tab20', 'tab20_r', 'tab20b', 'tab20b_r', 'tab20c', 'tab20c_r', 'terrain', 'terrain_r', 'turbo', 'turbo_r', 'twilight', 'twilight_r', 'twilight_shifted', 'twilight_shifted_r', 'viridis', 'viridis_r', 'vlag', 'vlag_r', 'winter', 'winter_r' """ sns.palplot(sns.color_palette(palette="BuGn_r",n_colors=24)) sns.palplot(sns.color_palette(palette="Reds",n_colors=25)) sns.palplot(sns.color_palette(palette="Blues",n_colors=26)) sns.palplot(sns.color_palette(palette="spring", n_colors=27)) sns.palplot(sns.color_palette(palette="summer", n_colors=28)) sns.palplot(sns.color_palette(palette="autumn", n_colors=29)) sns.palplot(sns.color_palette(palette="winter", n_colors=30)) sns.palplot(sns.color_palette(palette="Dark2", n_colors=2)) plt.show()
Seaborn分类图
对Seaborn简单了解之后,我们就开始用它绘制各种不同的图了。
柱状图
import matplotlib.pyplot as plt import numpy as np import seaborn as sns tips = sns.load_dataset("tips") # 在柱状图中指定为x的列会自动进行分组!(根据聚餐人数进行分组) sns.barplot(data=tips, x="size", y="tip", estimator=np.sum, palette="spring") plt.show() # hue="time"可以进一步分组! 在根据聚餐人数进行分组的基础上再根据吃饭时间进一步分组 sns.barplot(data=tips, x="size", y="tip", hue="time", estimator=np.sum, palette="summer") plt.show()
箱形图
如果我们村有4000户突然有一天世界首富搬来了。我统计了每家的总资产。你可能想到了柱状图,但是你总不能给我画4001根柱子吧。
现在我应该通过一张什么图可以很明显的看出村里谁家比较有钱(异常值)?村里大多数人处在一个什么水平(分布情况)?
箱型图又称为盒须图对数据进行高度压缩 ,我们可以利用箱型图直观反映出一组数据的分布情况和异常值。
一个箱型图一定包含:上边缘(上限值)、下边缘(下限值)、上四份位数、下四份位数、中位数。还有可能在上限上面和下限下面出现异常值。
import numpy as np import seaborn as sns from matplotlib import pyplot as plt tips = sns.load_dataset("tips") #求四分位数 Q1 = np.percentile(tips["total_bill"], 25) print(np.percentile(tips["total_bill"], 50)) Q2 = np.percentile(tips["total_bill"], 75) #直接看四分位数 print(tips.describe()) IQR = Q2 - Q1 # 下限(上边缘) print(IQR) print(Q1 - IQR * 1.5) # 如果数字列表中的最小值, 小于下限值,此时下限为数字列表中的最小值!也就是没有异常值! # 上限(下边缘) print(Q2+IQR*1.5) #如果数字列表中的最大值,大于上限值,此时这个最大值就是异常值!否则就是没有异常值! sns.boxplot(data=tips) plt.show()
小提琴图
小提琴图是箱图和密度图的一种结合图形。左右越宽代表当前位置数据越密集。
import seaborn as sns from matplotlib import pyplot as plt iris=sns.load_dataset("iris") sns.violinplot(data=iris) plt.show()
散点图
我有时候特别想看看西二旗地铁站哪个区域人员分布最密集?
散点图,顾名思义就是由一些散乱的点组成的图表,这些点在哪个位置,是由其X值和Y值确定的。所以也叫做XY散点图。
如果将图表区域比做一个盘子,那么这些散图的点就是“大珠小珠落玉盘”,点犹如一颗颗繁星,分布在广袤的天空,如下图
1.带状散点图
2.蜂群散点图
import seaborn as sns from matplotlib import pyplot as plt iris=sns.load_dataset("iris") sns.swarmplot(data=iris) plt.show()
3.小提琴图和蜂群图/带状图散点图进行结合
#小提琴图和蜂群图/带状图进行结合 import seaborn as sns from matplotlib import pyplot as plt plt.rcParams["figure.figsize"]=(10,6) iris=sns.load_dataset("iris") sns.violinplot(data=iris) # sns.swarmplot(data=iris) sns.stripplot(data=iris,palette="rainbow") plt.show()
4.catterplot分散散点图
sns.set_style("darkgrid",rc={"font.family":"KaiTi"}) plt.rcParams["font.family"]="Microsoft YaHei" plt.rcParams["figure.figsize"]=(10,6) scatterploter=sns.scatterplot(data=mpg,x="weight",y="mpg",hue="origin",size="mpg") scatterploter.set_title("汽车耗油量统计") scatterploter.set_xlabel('汽车重量(公吨)') scatterploter.set_ylabel('耗油量/公里') plt.show()
以上我们可以很清楚地得知
1.美国产的汽车品牌最多
2.日系和欧系汽车都比较省油其中日系车更甚。
3.越省油的汽车车身重量越轻
mpg=sns.load_dataset("mpg") #y=汽车的重量 #x=没加仑汽油可以跑的距离 #hug:使用不同的颜色区分不同点(汽车产地,美系车?日系车?欧洲系车?)--颜色 #size:="model_year",x值越大点越大,值越小点越小。----大小 #stylestyle="cylinders"根据不同cylinders选择不同的形状点。---形状 sns.scatterplot(data=mpg,x="weight",y="mpg",hue="origin",size="model_year",style="cylinders") plt.show()