目录
0、seaborn包基本使用
1 pandas打印报表(推荐使用)
2 缺失值分析--Missingno
1,对于每一列数据进行分析缺失值
矩阵图
柱状图
热力图
3.画分布图--比如正太分布图seaborn
4、数据可视化--
1,热度图seaborn--满足条件的数据的个数如年龄段为2的女生有多少人
2、柱状图(查看其中一个特征的每一个种类有多少--比如男性有多少,女性有多少)
seaborn
pandas
5、多变量之间的关系(连续变量)推荐散点图
pandas
seaborn 三个变量(两个连续画点,一个离散分类)
两个变量(点数少)
6、回归画图:(画散点图和拟合直线图)连续值
推荐:lmplot 画散点图和拟合直线图
三个变量(画两条线,(两个连续画点,一个离散分类))
四个变量(多个图显示)
7、多变量之间的关系(一个连续一个离散变量)推荐散点蜂图
三个变量(用颜色区分,两个离散,一个连续)
8、盒图,小提琴图
小提琴图
9、显示值的集中趋势可以用条形图
10、 点图可以更好的描述变化差异
11多重面板:(整合前面的)
12、FacetGrid(干的事情和前面一样,新的方式吧,这个好像很牛逼)
13、热力图(一共三列数据)做成表格
可视化使用的数据格式均使用dateframe格式
import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
def sinplot(flip=1):
x = np.linspace(0, 14, 100)
for i in range(1, 7):
plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)
画图之前先设置画图的风格:'''5种主题风格darkgrid whitegrid dark white ticks'''下面语句只能选择一个风格
sns.set_style("whitegrid") #更喜欢这种风格 ,使用sns设置plot画图的风格,但是并没有画图。
# sns.set() # 设置默认值风格
# sns.set_context("poster") # "paper" "talk" "poster" "notebook" 这个指定线条粗细的越来越粗
sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5}) #font_scale坐标轴数字大小 rc:线条大小
sns.despine() #设置
plt.figure(figsize=(8, 6)) #设置图像长宽大小,长8,宽6
画图:
sinplot()
sns.boxplot(data=data)
画完图设置边界线(去掉上、下左右、边界线):
sns.despine() # 默认去掉右边和上边的边界线,sns.despine(left=True)这样写是去掉左边的边界线
显示图像:
plt.show()
对于子图中不同的图像设置不同的风格:用with ,with相当一个域,类似于函数域
with sns.axes_style("darkgrid"):
plt.subplot(211)
sinplot()
plt.subplot(212)
sinplot(-1)
关于颜色的选取:离散的颜色,
current_palette = sns.color_palette() # 默认颜色,
sns.palplot(sns.color_palette("hls", 8)) #'hls'是一个系统的颜色空间返回8种不同的颜色
sns.palplot(sns.hls_palette(8, l=.7, s=.9)) # hls_palette()函数来控制颜色的亮度和饱和 l-亮度 lightness ,s-饱和 saturation
sns.palplot(current_palette) # palplot用来画图的,参数是颜色
sns.palplot(sns.color_palette("Paired",8)) # 8种颜色,两个两个是一对,深蓝和浅蓝 ...
# 使用xkcd颜色来命名颜色 xkcd包含了一套众包努力的针对随机RGB色的命名。产生了954个可以随时通过xdcd_rgb字典中调用的命名颜色。
plt.plot([0, 1], [0, 1], sns.xkcd_rgb["pale red"], lw=3)
plt.plot([0, 1], [0, 2], sns.xkcd_rgb["medium green"], lw=3)
plt.plot([0, 1], [0, 3], sns.xkcd_rgb["denim blue"], lw=3)
关于颜色的选取:连续渐变的颜色
sns.palplot(sns.color_palette("Blues")) # 正常是离散的传入参数就变成连续的了 由浅到深
sns.palplot(sns.color_palette("BuGn_r")) # 由深到浅,如果想要翻转渐变,可以在面板名称中添加一个_r后缀
sns.palplot(sns.light_palette("green")) #由浅到深
sns.palplot(sns.dark_palette("purple")) # 由深到浅,
sns.palplot(sns.light_palette("navy", reverse=True)) # 由深到浅,
sns.palplot(sns.color_palette("cubehelix", 8))
----------------------------------------------------------------------------------
画图:单特征使用直方图好用,2个特征使用散点图好 --特征就是变量
x = np.random.normal(size=100) x是100个随机数字
sns.distplot(x,kde=False) #这个函数是画直方图或者柱状图,在特定区间中有多少个数字 ,分成默认个区间
sns.distplot(x, bins=20, kde=False) #指定分成20个区间
x = np.random.gamma(6, size=200)
from scipy import stats, integrate
sns.distplot(x, kde=False, fit=stats.gamma) # 用曲线拟合一下,用到了scipiy这个库
2变量 举例 数据量比较小用散点图
mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])
sns.jointplot(x="x", y="y", data=df); #这个是画出来x和y的三点图,又画出来每一个变量的直方图
数据量比较大,不能用散点图了,看不了,用半透明的图,kind="hex"
x, y = np.random.multivariate_normal(mean, cov, 1000).T
with sns.axes_style("white"): 设置风格
sns.jointplot(x=x, y=y, kind="hex", color="k")
3个以上个变量怎么办?我要看两两变量之间的散点图,单个变量的直方图,这个功能包括了上面的sns.jointplot
iris = sns.load_dataset("iris") #导入内置数据集,有4列,也就是4个特征
print(iris)
sns.pairplot(iris)
-----------------------------------------------
画回归图:两个变量既画散点图,又画回归图,看看是不是线性关系
例子:regplot 和 lmplot 基本一样,但是开始推荐使用regplot
tips = sns.load_dataset("tips")
sns.regplot(x="total_bill", y="tip", data=tips) #这里是dateframe格式,也可以是其他的吧,不知道
sns.lmplot(x="total_bill", y="tip", data=tips); # 注意这里两个变量是连续值,如果是离散值就不能用了,很不好看
sns.regplot(x="size", y="tip", data=tips, x_jitter=.05) #x_jitter 在x的点加上小范围的浮动
两个变量有一个是离散值怎么画图:swarmplot 这个好 ,三变量,只不过一个用颜色区分开了
sns.stripplot(x="day", y="total_bill", data=tips); #这么画太丑了,不好看,都重叠一起了,
sns.stripplot(x="day", y="total_bill", data=tips, jitter=True) #x轴左右摇摆一下分开,好一些
sns.swarmplot(x="day", y="total_bill", data=tips) #这个蜂图感觉更好
sns.swarmplot(x="day", y="total_bill", hue="sex",data=tips) #这个更厉害了,将男女都区别开了,用不同的颜色分开
盒图/小提琴图(用来画离群点的),小提琴图更好
IQR即统计学概念四分位距,第一/四分位与第三/四分位之间的距离
N = 1.5IQR 如果一个值>Q3+N或 < Q1-N,则为离群点
sns.boxplot(x="day", y="total_bill", hue="time", data=tips);#菱形,代表离群点
sns.violinplot(x="total_bill", y="day", hue="time", data=tips); #中间粗,两边细,对称的
sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True); # 这个不对称,被sex这个给分开了
不同的图可以合并,比如蜂图和小提琴图
sns.violinplot(x="day", y="total_bill", data=tips, inner=None)
sns.swarmplot(x="day", y="total_bill", data=tips, color="w", alpha=.5) #alpha透明度
直方图:条形图
sns.barplot(x="sex", y="survived", hue="class", data=titanic); x轴是性别,y轴是获救率, 将x轴的人按class划分三个
点图可以更好的描述变化差异:折线图,点图,很好用
sns.pointplot(x="sex", y="survived", hue="class", data=titanic);
sns.pointplot(x="class", y="survived", hue="sex", data=titanic,
palette={"male": "g", "female": "m"},
markers=["^", "o"], linestyles=["-", "--"]);
宽形数据:和盒图
sns.boxplot(data=iris,orient="h"); #orient 这里是横的画
多层面板分类图:将前面整合在一起了factorplot
'''
Parameters:
x,y,hue 数据集变量 变量名
date 数据集 数据集名
row,col 更多分类变量进行平铺显示 变量名
col_wrap 每行的最高平铺数 整数
estimator 在每个分类中进行矢量到标量的映射 矢量
ci 置信区间 浮点数或None
n_boot 计算置信区间时使用的引导迭代次数 整数
units 采样单元的标识符,用于执行多级引导和重复测量设计 数据变量或向量数据
order, hue_order 对应排序列表 字符串列表
row_order, col_order 对应排序列表 字符串列表
kind : 可选:point 默认, bar 柱形图, count 频次, box 箱体, violin 提琴, strip 散点,swarm 分散点 size 每个面的高度(英寸) 标量 aspect 纵横比 标量 orient 方向 "v"/"h" color 颜色 matplotlib颜色 palette 调色板 seaborn颜色色板或字典 legend hue的信息面板 True/False legend_out 是否扩展图形,并将信息框绘制在中心右边 True/False share{x,y} 共享轴线 True/False
'''
sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips)
sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips, kind="bar")
sns.factorplot(x="day", y="total_bill", hue="smoker",
col="time", data=tips, kind="swarm")
sns.factorplot(x="time", y="total_bill", hue="smoker",
col="day", data=tips, kind="box", size=4, aspect=.5)
非常好用的FacetGrid
g = sns.FacetGrid(tips, col="time") 先占好位置,y轴tips ,按照time种类分成几类,这里是一个变量
g.map(plt.hist, "tip");# plt.hist 指定画这种图直方图
g = sns.FacetGrid(tips, col="sex", hue="smoker")
g.map(plt.scatter, "total_bill", "tip", alpha=.7)
g.add_legend();
g = sns.FacetGrid(tips, row="smoker", col="time", margin_titles=True)
g.map(sns.regplot, "size", "total_bill", color=".1", fit_reg=False, x_jitter=.1);
g = sns.FacetGrid(tips, col="day", size=4, aspect=.5)
g.map(sns.barplot, "sex", "total_bill");
from pandas import Categorical
ordered_days = tips.day.value_counts().index
print (ordered_days)
ordered_days = Categorical(['Thur', 'Fri', 'Sat', 'Sun'])
g = sns.FacetGrid(tips, row="day", row_order=ordered_days,
size=1.7, aspect=4,)
g.map(sns.boxplot, "total_bill");
pal = dict(Lunch="seagreen", Dinner="gray")
g = sns.FacetGrid(tips, hue="time", palette=pal, size=5)
g.map(plt.scatter, "total_bill", "tip", s=50, alpha=.7, linewidth=.5, edgecolor="white")
g.add_legend();
g = sns.FacetGrid(tips, hue="sex", palette="Set1", size=5, hue_kws={"marker": ["^", "v"]})
g.map(plt.scatter, "total_bill", "tip", s=100, linewidth=.5, edgecolor="white")
g.add_legend();
with sns.axes_style("white"):
g = sns.FacetGrid(tips, row="sex", col="smoker", margin_titles=True, size=2.5)
g.map(plt.scatter, "total_bill", "tip", color="#334488", edgecolor="white", lw=.5);
g.set_axis_labels("Total bill (US Dollars)", "Tip");
g.set(xticks=[10, 30, 50], yticks=[2, 6, 10]);
g.fig.subplots_adjust(wspace=.02, hspace=.02);
#g.fig.subplots_adjust(left = 0.125,right = 0.5,bottom = 0.1,top = 0.9, wspace=.02, hspace=.02)
iris = sns.load_dataset("iris")
g = sns.PairGrid(iris)
g.map(plt.scatter);
g = sns.PairGrid(iris)
g.map_diag(plt.hist)
g.map_offdiag(plt.scatter);
g = sns.PairGrid(iris, hue="species")
g.map_diag(plt.hist)
g.map_offdiag(plt.scatter)
g.add_legend();
g = sns.PairGrid(iris, vars=["sepal_length", "sepal_width"], hue="species")
g.map(plt.scatter);
g = sns.PairGrid(tips, hue="size", palette="GnBu_d")
g.map(plt.scatter, s=50, edgecolor="white")
g.add_legend();
------------------------------------
热度图:
flights = sns.load_dataset("flights")
flights.head() #读进一个pandas数据,也就是矩阵,好多行,3列(必须是三列,两列是位置,一列是数值),每个位置有一个点
flights = flights.pivot("month", "year", "passengers") #转化为,矩阵形式,
ax = sns.heatmap(flights) # 画图
ax = sns.heatmap(flights, annot=True,fmt="d") #annot每一个位置显示数值 ,
ax = sns.heatmap(flights, linewidths=.5) 每个格子之间有缝隙
ax = sns.heatmap(flights, cmap="YlGnBu") #指定颜色,推荐
ax = sns.heatmap(flights, cbar=False) # 没有条,不要用这个
报表功能特别强大,几乎涵盖了前面的所有
注意报表能在notebook使用
import pandas as pd
datefram=pd.read_csv('bigdata1.csv')
import pandas_profiling
a= pandas_profiling.ProfileReport(datefram)
a
pycharm不能打印出来
Missingno:这个包是个画图包封装了matplotlib包一条语句分析缺失值
https://github.com/ResidentMario/missingno
import pandas as pd
import numpy as np
import missingno as msno
from matplotlib import pyplot as plt
datefram=pd.read_csv('bigdata1.csv')
msno.matrix(datefram.sample(datefram.shape[0]), figsize=(16, 16), width_ratios=(15, 1))
plt.rcParams['font.sans-serif']=['SimHei'] #这两行用来显示汉字
plt.rcParams['axes.unicode_minus'] = False
plt.show()
(将上面的matrix代码换成下面这个)
msno.bar(datefram.sample(datefram.shape[0]), figsize=(12, 7), )
msno.heatmap(datefram.sample(datefram.shape[0]),figsize=(12, 7), )
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as stats
mu = 0
sigma = 1
sampleNo = 10000
x = np.random.normal(mu, sigma, sampleNo ) #生成10000个数,这10000个数服从标准正太分布
'''
# 纵坐标代表概率密度值,也就是一个数字出现几次,x:数据;bins:本次几个区间;fit=stats.gamma:代表要画出拟合曲线
'''
sns.distplot(x, bins=100, kde=False, fit=stats.gamma)
plt.show()
构建一个矩阵或者表格形式的数据
# 随变找两个离散值的特征,看看每个对应的种类的个数
temp = pd.crosstab(datefram['性别'], datefram['年龄段'])
这是一个表格
年龄段 2.0 3.0 4.0 5.0 6.0 7.0 8.0
性别
女 7 105 150 91 40 12 3
男 17 221 331 134 38 15 6
画图
sns.heatmap(pd.crosstab(datefram['性别'], datefram['年龄段']), cmap='Blues', annot=True, fmt='d', ax=ax)
注:年龄段一列必须是数值型的一列,否则报错
fig, ax = plt.subplots(figsize=(12, 8))
sns.distplot(datefram['年龄段'], kde=False)
fig.tight_layout()
# 使用pandas进行打印图像
datefram['年龄段'].value_counts(dropna=False, ascending=True).plot(kind='barh', ax=ax)
print(datefram['年龄段'].value_counts())打印出具体值
盒图,小提琴图也可以
from pandas.tools.plotting import scatter_matrix
fig, ax = plt.subplots(figsize=(10, 10))
scatter_matrix(datefram[['年龄段自定义等级', '年龄段', '自定义报价等级']], alpha=0.2, diagonal='hist', ax=ax)
#对角线处为自己和自己,其他地方是每两个特征之间的关系
我要看两两变量之间的散点图,
sns.pairplot(iris) # iris为dateframe结构
sns.pairplot(iris) # iris为dateframe结构
sns.jointplot(x="x", y="y", data=df); #这个是画出来x和y的三点图,又画出来每一个变量的直方
点数多:
with sns.axes_style("white"): 设置风格
sns.jointplot(x=x, y=y, kind="hex", color="k")
找到上图的具体的一个线性的 画图
fig, ax = plt.subplots(figsize=(10, 7))
sns.regplot('年龄段', '年龄段自定义等级', data=datefram, ax=ax)
ax.set_ylabel("Height [cm]")
ax.set_xlabel("Weight [kg]")
fig.tight_layout()
sns.regplot(x="total_bill", y="tip", data=tips) #data为dateframe结构
sns.lmplot(x="total_bill", y="tip", data=tips); 同理 推荐 tips是dateframe格式,x:‘total_bill’是tips的一个列名;y="tip"也是一个列名
'''
x,y,hue 都是tips数据dateframe型数据的列名
x和y都必须是数值型的数据,hue一般为离散型非数字型的数据(数值型也可以)
下面例子是smoker有两种吸烟还是不吸烟,分成不同颜色画散点图和拟合直线
'''
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips);
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips);
sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips);
#col 离散型的有两个种类就画出两个图,有三个就画三个图
sns.swarmplot(x="day", y="total_bill", data=tips) # tips是dataframe格式
sns.swarmplot(x="day", y="total_bill", hue="sex",data=tips)
sns.boxplot(x="day", y="total_bill", hue="time", data=tips);
sns.violinplot(x="total_bill", y="day", hue="time", data=tips);
sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True);
sns.barplot(x="sex", y="survived", hue="class", data=titanic);
sns.pointplot(x="sex", y="survived", hue="class", data=titanic);
sns.pointplot(x="class", y="survived", hue="sex", data=titanic,
palette={"male": "g", "female": "m"},
markers=["^", "o"], linestyles=["-", "--"]);
sns.factorplot(x="day", y="total_bill", hue="smoker",
col="time", data=tips, kind="swarm")
g = sns.FacetGrid(tips, row="smoker", col="time", margin_titles=True)
g.map(sns.regplot, "size", "total_bill", color=".1", fit_reg=False, x_jitter=.1);
g = sns.PairGrid(iris, hue="species")
g.map_diag(plt.hist)
g.map_offdiag(plt.scatter)
g.add_legend();
flights = flights.pivot("month", "year", "passengers") #转换为坐标和对应值关系表格形式
print (flights)
ax = sns.heatmap(flights)
ax = sns.heatmap(flights, annot=True,fmt="d")
ax = sns.heatmap(flights, linewidths=.5)