编辑器:jupyter notebook
Seaborn 是一个基于matplotlib的 Python 数据可视化库。它提供了一个高级界面,用于绘制有吸引力且信息丰富的统计图形。
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'
plt.figure(figsize=(4, 3))
x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
plt.bar(x, y)
plt.show()
sns.set_style('whitegrid')
plt.figure(dpi=200)
sns.barplot(x=x,y=y)
df = pd.read_excel('data/plot.xlsx',sheet_name='penguins')
df.head()
plt.figure(dpi=200)
sns.ecdfplot(data=df,x='鳍肢长度')
plt.show
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'
df = pd.read_excel('./data/plot.xlsx', sheet_name='line')
df.head()
# 该函数通过plt.figure不能修改分辨率,但是支持导出设置分辨率
sns.relplot(x='学号',y='语文',kind='line',data=df)
plt.ylim(0,110)
plt.savefig('figure/1relplot绘制折线图.png',dpi=300)
plt.show()
plt.figure(dpi=200)
sns.lineplot(x='学号',y='语文',data=df)
plt.ylim(0,110)
plt.savefig('figure/21lineplot绘制折线图.png',dpi=300)
plt.show()
tb = df[['姓名','语文','数学','英语']]
tb = tb.set_index('姓名')
tb
plt.figure(dpi=200)
sns.lineplot(data=tb,markers=True) # markers=True 添加标记点
plt.ylim(0,110) # 设置y轴的刻度范围
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'
df = pd.read_excel('./data/plot.xlsx', sheet_name='hist')
df.head()
plt.figure(dpi=200)
sns.distplot(df['分数'])
plt.show()
# plt.figure()不能调节分辨率,但是导出可以
sns.displot(df['分数'])
plt.show()
plt.figure(dpi=200)
sns.histplot(data=df['分数'],kde=True,bins=range(40,120,10))
sns.rugplot(data=df['分数']) # 添加地毯图
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'
df = pd.read_excel('./data/plot.xlsx', sheet_name='barplot')
df.head()
plt.figure(dpi=200)
sns.barplot(data=df,x='采购数量',y='门店',hue='品类',estimator=np.sum,ci=False) # hue 图例; estimator默认求平均值; ci自信区间
plt.show()
plt.figure(dpi=200)
sns.barplot(data=df,y='采购数量',x='门店',hue='品类',estimator=np.sum,ci=False) # hue 图例; estimator默认求平均值; ci自信区间
plt.show()
tips = pd.read_excel('./data/plot.xlsx', sheet_name='tips')
tips.head()
plt.figure(dpi=200)
sns.countplot(data=tips,x='用餐时刻',hue='是否吸烟')
plt.show()
plt.figure(dpi=200)
sns.countplot(data=tips,y='用餐时刻',hue='是否吸烟')
plt.show()
plt.figure(dpi=200)
sns.pointplot(data=tips,x='星期',y='小费',order=['周四','周五','周六','周日']) # order 设置x轴顺序
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'
df = pd.read_excel('./data/plot.xlsx', sheet_name='tips')
df.head()
plt.figure(dpi=200)
sns.scatterplot(
data=df,
x='总消费',
y='小费',
hue='性别',
style='性别', # 标记字段样式
markers={'男性':'o','女性':'*'}, # 指定标记样式
palette={'男性':'blue','女性':'green'} # 指定标记颜色
)
plt.show()
plt.figure(dpi=200)
sns.stripplot(
data=df,
x='星期',
y='总消费',
hue='性别',
order=['周四','周五','周六','周日'],
dodge=True, # 将男女分开展示
jitter=0.2, # 将点之间散开一点
)
plt.legend(ncol=2) # 将图例设置为两列
plt.show()
plt.figure(dpi=200)
sns.swarmplot(data=df,
x='星期',
y='总消费',
order=['周四','周五','周六','周日']
)
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'
df = pd.read_excel('./data/plot.xlsx', sheet_name='tips')
df.head()
# 不支持 plt.figure 设置 dpi
sns.lmplot(data=df,x='总消费',y='小费')
plt.show()
plt.figure(dpi=200)
sns.regplot(data=df,x='总消费',y='小费')
plt.show()
sns.lmplot(data=df,
x='总消费',
y='小费',
hue='是否吸烟', # 设置图例
col='用餐时刻', # 总图的列字段
row='性别', # 总图的行字段
)
plt.show()
# 残差(统计学称误差):实际值与估计值(拟合值,回归方程y=kx+b的y值)之间的差
# 偏差:与均值的差
plt.figure(dpi=200)
sns.residplot(data=df,x='总消费',y='小费')
plt.show()
df.head()
from sklearn.linear_model import LinearRegression
# 实例化线性回归模型
lr = LinearRegression()
x,y = df[['总消费']],df[['小费']]
# 训练模型
lr.fit(x,y)
# 查看系数(k)
lr.coef_ # array([[0.10502452]])
# 查看截距(b)
lr.intercept_ # array([0.92026961])
# 设置测试值(x值)
pre_x = pd.DataFrame({'总消费':[20]}) # 二维
# 预测小费(y值)
lr.predict(pre_x) # array([[3.02075996]])
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'
df = pd.read_excel('./data/plot.xlsx', sheet_name='tips')
df.head()
plt.figure(dpi=200)
sns.boxplot(
data=df,
x='星期',
y='总消费',
hue='用餐时刻',
order=['周四','周五','周六','周日'],
hue_order=['午餐','晚餐'],
whis=1.5, # 基于几倍的四分位距(IQR)来检测异常值
)
plt.show()
plt.figure(dpi=200)
sns.boxenplot(
data=df,
x='星期',
y='总消费',
order=['周四','周五','周六','周日']
)
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'
df = pd.read_excel('./data/plot.xlsx', sheet_name='iris')
df.head()
plt.figure(dpi=200)
sns.kdeplot(x=df['萼片长度'],shade=True,color='blue')
sns.kdeplot(x=df['萼片宽度'],shade=True,color='red')
plt.xlabel('萼片长度&萼片宽度')
plt.legend(['萼片长度','萼片宽度'])
plt.show()
plt.figure(dpi=200)
# sns.kdeplot(x=df['萼片长度'],y=df['萼片宽度'],shade=True)
sns.kdeplot(data=df,x='萼片长度',y='萼片宽度',shade=True)
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'
df = pd.read_excel('./data/plot.xlsx', sheet_name='tips')
df.head()
plt.figure(dpi=200)
sns.violinplot(data=df,x='星期',y='总消费',hue='用餐时刻',order=['周四','周五','周六','周日'])
plt.legend(loc='lower right',fontsize=8)
plt.show()
plt.figure(dpi=200)
sns.violinplot(data=df,x='星期',y='总消费',split=True,hue='性别',order=['周四','周五','周六','周日'],hue_order=['男性','女性'])
plt.legend(loc='upper left',fontsize=8)
plt.show()
sns.catplot(
kind='violin',
data=df,
x='星期',
y='总消费',
col='用餐时刻',
row='性别',
order=['周四','周五','周六','周日']
)
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'
tips = pd.read_excel('./data/plot.xlsx', sheet_name='tips')
tips.head()
# 创建对象
g = sns.FacetGrid(data=tips,col='性别',hue='是否吸烟')
# 定义图类型
g.map(sns.scatterplot,'总消费','小费')
# 添加图例
g.add_legend()
plt.show()
# 创建对象
g = sns.FacetGrid(data=tips,col='星期')
# 定义图类型
g.map(sns.barplot,'性别','总消费',order=['男性','女性'])
plt.show()
iris = pd.read_excel('./data/plot.xlsx', sheet_name='iris')
iris.head()
sns.pairplot(data=iris,hue='物种')
plt.show()
# 实例化对象
g = sns.PairGrid(data=iris,hue='物种')
# 设置图类型
g.map_upper(sns.scatterplot) # 上三角图类型
g.map_diag(sns.kdeplot) # 对角线图类型
g.map_lower(sns.kdeplot) # 下三角
# 添加图例
g.add_legend()
plt.show()
penguins = pd.read_excel('./data/plot.xlsx', sheet_name='penguins')
penguins.head()
sns.jointplot(data=penguins,x='鸟喙长度',y='鸟喙深度',hue='物种')
plt.show()
sns.jointplot(kind='kde',data=penguins,x='鸟喙长度',y='鸟喙深度',hue='物种')
plt.show()
# 实例化对象
g = sns.JointGrid(data=penguins,x='鸟喙长度',y='鸟喙深度')
# 设置图类型
# g.plot(joint_func, marginal_func, **kwargs) ——————> joint_func: 内部图类型 ; marginal_func: 外部图类型
g.plot(sns.regplot,sns.boxplot)
plt.show()
# 实例化对象
g = sns.JointGrid(data=penguins,x='鸟喙长度',y='鸟喙深度',hue='物种')
# 设置图类型
# g.plot(joint_func, marginal_func, **kwargs) ——————> joint_func: 内部图类型 ; marginal_func: 外部图类型
g.plot(sns.scatterplot,sns.histplot)
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'
df = pd.read_excel('./data/plot.xlsx', sheet_name='combine')
df.head()
x,y1,y2 = df['月份'],df['销量'],df['转化率']
plt.figure(dpi=200)
plt.bar(x=x,height=y1)
plt.ylabel('销量')
plt.title('1-6月的销量及转化率趋势')
for a,b in zip(x,y1):
plt.text(x=a,y=b,s=b,ha='center')
# 共享x轴,添加一个y轴
plt.twinx() # 加入次代码后,后边的代码都是基于此轴操作
plt.plot(x,y2,color='g',marker='o')
plt.ylim(0,1)
plt.ylabel('转化率')
for a,b in zip(x,y2):
plt.text(x=a,y=b+0.04,s='{:.1%}'.format(b),ha='center',fontsize=8)
plt.show()
x,y1,y2 = tb.index,tb['办公'],tb['生活']
plt.figure(dpi=200)
plt.bar(x,y1,label='办公')
# bottom 实现堆积操作
plt.bar(x,y2,label='生活',bottom=y1)
plt.title('各区销售额的堆积柱形图')
plt.xlabel('地区')
plt.ylabel('销售额')
plt.legend()
# 添加办公的数据标签
for a,b, in zip(x,y1):
plt.text(x=a,y=b,s='{:.0f}万'.format(b/10000),ha='center',va='top')
# 添加生活的数据标签
for a,b,c in zip(x,y1,y2):
plt.text(x=a,y=b+c,s='{:.0f}万'.format(c/10000),ha='center')
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'
df = pd.read_excel('./data/plot.xlsx', sheet_name='iris')
df.head()
# 相关系数
data = df.corr()
data
plt.figure(dpi=200)
sns.heatmap(data=data,cmap='Blues',annot=True,fmt='.2f')
plt.show()