数据
数据载入:
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt, cm
import seaborn as sns
from sqlalchemy import create_engine
import sqlite3
import warnings
%matplotlib
warnings.filterwarnings('ignore')
# plt.style.use('ggplot')
sns.set()
np.random.seed(2019)
# 解决使用seaborn风格中文乱码问题
sns.set_style('whitegrid',{'font.sans-serif':['simhei']})
# 连接数据库
engine = create_engine('sqlite:///steam.sqlite')
# 导入数据
df = pd.read_sql('select * from steam', con=engine)
# 弃去index列
df.drop(columns='index', inplace=True)
data = df[(df.owners<5000)&(df.average_forever<10000)].sample(1000)
seaborn 高级用法
组合图表
relplot()
用于在FacetGrid上绘制关系图的图级界面
# 使用col分列, row分行
_ = sns.relplot(data=data, x='positive', y='negative', hue='us_rank',
col='free')
# 使用kind进行种类的选择
_ = sns.relplot(data=data, x='positive', y='negative', hue='us_rank',
col='free', kind='line',style="us_rank")
catplot()
用于将分类图绘制到FacetGrid上的图级界面
# 输入一个变量
_ = sns.catplot(data=data, x='free', col='us_rank', kind='count')
# 输入连个变量绘制小提琴图
_ = sns.catplot(data=data, x='free', y='score_rank', col='us_rank',
kind='violin')
jointplot()
用双变量和单变量图绘制两个变量的图
# 风格更改
sns.set(style='white', color_codes=True)
_ = sns.jointplot(data=data, x='userscore', y='positive')
# kind更改类型{“scatter”| “reg”| “resid”| “kde”| “hex”}可选默认scatter
_ = sns.jointplot(data=data, x='userscore', y='score_rank', kind='reg',
color='g')
# kde模式
_ = sns.jointplot(data=data, x='userscore', y='owners', kind='kde',
color='r')
# 将关键字参数传递给底层图,使用plot_joint添加密度估计
_ = sns.jointplot(data=data, x='userscore', y='owners',ratio=3,
marginal_kws=dict(bins=10,rug=True)
).plot_joint(sns.kdeplot, zorder=0, n_levels=6)
pairplot()
seaborn中最常用的工具,绘制数据集中的成对关系
sns.set(style="ticks", color_codes=True)
# 获取数据
data1 = data.iloc[:,[2, 3, 4, 5, 6, -2, -1]]
# 直接把pandas表格输入就能绘制每成对关系, kind和diag_kind分别更改两边和对角线的图类型
_ = sns.pairplot(data1, kind='reg', diag_kind='hist')
# 更改cmap样式, 关键字传递给底层函数
_ = sns.pairplot(data1, hue='us_rank', palette='RdYlBu_r',
diag_kws=dict(shade=False))
FacetGrid()
用于绘制条件关系的多图网格.
工作流程是FacetGrid使用数据集和用于构造网格的变量初始化对象。然后,可以通过调用FacetGrid.map()或将一个或多个绘图函数应用于每个子集 FacetGrid.map_dataframe()。最后,可以使用其他方法调整绘图,以执行更改轴标签,使用不同刻度或添加图例等操作
# 先根据分类创建网格
g = sns.FacetGrid(data=data, col='us_rank', row='free', hue='score_rank',
palette='cool')
# 在每个点位格中绘制图
g = g.map(plt.scatter,'owners','positive', marker='+')
g.savefig('facetGrid.png')
# 使用自定义函数
def myplot(x, y, **kwargs):
x_ = np.log(x)
y_ = np.log(y)
plt.scatter(x_, y_, **kwargs)
g = sns.FacetGrid(data, col='us_rank', row='free', palette='cool',
hue='score_rank')
g = g.map(myplot,'owners','positive').set_titles("{col_name} pic")
g.savefig('facetGrid2.png')
PairGrid()
用于绘制数据集中成对关系的子图网格
sns.set()
g = sns.PairGrid(data, hue='us_rank', palette='cool',
vars=['owners', 'average_forever','score_rank','userscore'])
# 设置对角线绘图样式
g = g.map_diag(plt.hist, histtype='step', linewidth=3)
# 设置除对角线以外单元格绘图样式
g = g.map_offdiag(plt.scatter).add_legend()
g.savefig('PairGrid1.png')
g = sns.PairGrid(data, vars=['positive', 'average_forever','score_rank','userscore'])
# 设置对角线绘图样式
g = g.map_diag(plt.hist, histtype='step', linewidth=3, color='k').add_legend()
# 设置对角线上面单元格样式
g = g.map_upper(sns.regplot, color='g')
# 设置对角线下面单元格样式
g = g.map_lower(sns.kdeplot, cmap='cool')
# 保存
g.savefig('PairGrid2.png')
JointGrid()
用于绘制具有边缘单变量图的双变量图的网格
from scipy import stats
sns.set(style='white')
g = sns.JointGrid(data=data, x='userscore', y='positive')
# 设置中间位置图形
g = g.plot_joint(plt.scatter, color='g', s=40, edgecolor='w')
# 设置边缘图像
g = g.plot_marginals(sns.distplot, kde=False, color="r")
# 添加注释
g = g.annotate(stats.pearsonr)
# 保存图片
g.savefig('JointGrid.png')