python图表制作

画一个吸引人注意的图表相当重要。当你探索一个数据集,需要画图表,图表看起来令人愉悦是件很高兴的事。在与你的观众交流观点时,可视化同样重要,同时,也很有必要去让图表吸引注意力和印入脑海里。Matplotlib自动化程度非常高,但是,掌握如何设置系统以便获得一个吸引人的图是相当困难的事。为了控制matplotlib图表的外观,Seaborn模块自带许多定制的主题和高级的接口。
我们用ipython notebook

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
np.random.seed(sum(map(ord,"aesthetics")))

让我们定以一个函数来画正弦函数,这将帮助我们了解我们可以控制的不同风格的参数。

def sinplot(flip=1):
    x =np.linspace(0,14,100)
    for i in range(1,7):
        plt.plot(x,np.sin(x+i*0.5)*(7-i)*flip)
import seaborn as sns
sinplot()

2 图形分类
因变量绘图
1 线箱图boxplot
2 小提琴图violinplot
3 散点图striplot
4 带分布的散点图swarmplot
5 直方图barplot
6 计数直方图countplot
7 两变量关系图factorplot
回归图
回归图只要探讨两连续数值变量的变化趋势情况,绘制x-y的散点图和回归曲线。
1 线性回归图implot
2 线性回归图regplot
分布图
包括单变量核密度曲线,直方图,双变量多变量的联合直方图,和密度图
热力图
1 热力图heatmap
聚类图
1 聚类图clustermap
时间序列图
1 时间序列图tsplot
2我的时间序列图plot_ts_d,plot_ts_m
3 因子变量绘图
3.1 boxplot线箱图

import seaborn as sns
sns.set_style("whitegrid")
tips = sns.load_dataset("tips")
# 绘制箱线图
ax = sns.boxplot(x=tips["total_bill"])
# 竖着放的箱线图,也就是将x换成y
ax = sns.boxplot(y=tips["total_bill"])

这里写图片描述

# 分组绘制箱线图,分组因子是day,在x轴不同位置绘制
ax = sns.boxplot(x="day", y="total_bill", data=tips)

这里写图片描述

#分组箱线图,分子因子是smoker,不同的因子用颜色区分
#相当于分组之后又分组
ax =sns.boxplot(x="day",y="total_bill",hue="smoker",data=tips, palette="Set3")

这里写图片描述

# 改变线宽,linewidth参数
ax = sns.boxplot(x="day", y="total_bill",hue="time",data=tips, linewidth=2.5)
#改变x轴顺序,order参数
ax = sns.boxplot(x="time", y="tip", data=tips,order=["Dinner", "Lunch"])
# 对dataframe的每个变量都绘制一个箱线图,水平放置
iris = sns.load_dataset("iris")
ax = sns.boxplot(data=iris, orient="h", palette="Set2"

这里写图片描述

# 箱线图+有分布趋势的散点图
# 图形组合也就是两条绘图语句一起运行就可以了,相当于图形覆盖了
ax = sns.boxplot(x="day", y="total_bill", data=tips)
ax = sns.swarmplot(x="day", y="total_bill", data=tips, color=".25")

https://img-blog.csdn.net/20170403205820929?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3V6eXUxMjM0NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
3.3 stripplot散点图
需要注意的是,seaborn中有两个散点图,一个是普通的散点图,另一个是可以看出分布密度的散点图。下面把它们花在一起就明白了。

# 普通的散点图
ax1 = sns.stripplot(x=tips["total_bill"])
# 带分布密度的散点图
ax2 = sns.swarmplot(x=tips["total_bill"])

这里写图片描述

# 分组的散点图
ax = sns.stripplot(x="day", y="total_bill", data=tips)

这里写图片描述

# 添加抖动项的散点图,jitter可以是0.1,0.2...这样的小数,表示抖动的程度大小
ax = sns.stripplot(x="day", y="total_bill", data=tips, jitter=True)

这里写图片描述

# 重点来了,分组绘制,而且是分组后分开绘制,在柱状图中,跟分组柱状图类似的。
# 通过 hue, split 参数控制
# 1.分组
ax = sns.stripplot(x="sex",y="total_bill",hue="day",data=tips, jitter=True)
# 2.分开绘制
ax = sns.stripplot(x="day", y="total_bill", hue="smoker",data=tips, jitter=True,palette="Set2",split=True)

这里写图片描述

# 散点图+小提起图
# 两条命令一起运行就行了
ax=sns.violinplot(x="day",y="total_bill",data=tips,inner=None, color=".8")
ax=sns.stripplot(x="day",y="total_bill",data=tips,jitter=True)

这里写图片描述
3.4 swarmplot带分布的散点图
swarmplt的参数和用法和stripplot的用法是一样的,只是表现形式不一样而已。

import seaborn as sns
sns.set_style("whitegrid")
tips = sns.load_dataset("tips")
ax = sns.swarmplot(x=tips["total_bill"])

这里写图片描述

ax= sns.swarmplot(x="day",y ="total_bill",data = tips)

这里写图片描述
3.6 直方图
直方图的统计函数,绘制的是变量的均值 estimator=np.mean

# 注意看看Y轴,看到没,统计函数默认是 mean,
import seaborn as sns
sns.set_style("whitegrid")
tips = sns.load_dataset("tips")
ax = sns.barplot(x="day", y="total_bill", data=tips,ci=0)

这里写图片描述

# 分组的柱状图
ax = sns.barplot(x="day", y="total_bill", hue="sex", data=tips,ci=0)

这里写图片描述

# 绘制变量中位数的直方图,estimator指定统计函数
from numpy import median
ax = sns.barplot(x="day", y="tip", data=tips,estimator=median, ci=0)

这里写图片描述
3.7 countplot计数统计图
这个很重要,对因子变量计数,然后绘制条形图

import seaborn as sns
sns.set(style="darkgrid")
titanic = sns.load_dataset("titanic")
ax = sns.countplot(x="class", data=titanic)

这里写图片描述

# 分组绘图
ax = sns.countplot(x="class", hue="who", data=titanic)
# 如果是横着放,x用y替代
ax = sns.countplot(y="class", hue="who", data=titanic)

这里写图片描述
3.8.factorplot
这是一类重要的变量联合绘图。
绘制 因子变量-数值变量 的分布情况图。

# 用小提琴图 反应 time-pulse 两变量的分布情形
import seaborn as sns
sns.set(style="ticks")
exercise = sns.load_dataset("exercise")
g =sns.factorplot(x="time",y="pulse",hue="kind",data=exercise, kind="violin")

这里写图片描述

# 不同的deck(因子)绘制不同的alive(数值),col为分子图绘制,col_wrap每行画4个子图
titanic = sns.load_dataset("titanic")
g = sns.factorplot(x="alive", col="deck", col_wrap=4,data=titanic[titanic.deck.notnull()],kind="count", size=2.5, aspect=.8)
![这里写图片描述](https://img-blog.csdn.net/20170403222401446?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3V6eXUxMjM0NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

4.回归图

回归图有两个,我暂时没有看出他们有什么区别,从函数说明来看看吧。
lmplot: Plot data and regression model fits across a FacetGrid.
regplot:Plot data and a linear regression model fit.
4.1.回归图lmplot

# 线性回归图
import seaborn as sns; sns.set(color_codes=True)
tips = sns.load_dataset("tips")
g = sns.lmplot(x="total_bill", y="tip", data=tips)

这里写图片描述

# 分组的线性回归图,通过hue参数控制
g = sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips)

这里写图片描述

# 分组绘图,不同的组用不同的形状标记
g = sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips,markers=["o", "x"])

这里写图片描述

# 不仅分组,还分开不同的子图绘制,用col参数控制
g = sns.lmplot(x="total_bill", y="tip", col="smoker", data=tips)

这里写图片描述

# col+hue 双分组参数,既分组,又分子图绘制,jitter控制散点抖动程度
g = sns.lmplot(x="size", y="total_bill", hue="day", col="day",data=tips, aspect=.4, x_jitter=.1)

这里写图片描述

# 分组绘制,控制size尺寸
g = sns.lmplot(x="total_bill", y="tip", col="day", hue="day",data=tips, col_wrap=2, size=3)

这里写图片描述

# 既然col可以控制分组子图的,那么row也是可以控制分组子图的
g = sns.lmplot(x="total_bill", y="tip", row="sex", col="time", data=tips, size=3)

这里写图片描述

4.2.回归图regplot

import seaborn as sns; sns.set(color_codes=True)
tips = sns.load_dataset("tips")
ax = sns.regplot(x="total_bill", y="tip", data=tips)

这里写图片描述

# 控制散点的形状和颜色
import numpy as np; np.random.seed(8)
mean, cov = [4, 6], [(1.5, .7), (.7, 1)]
x, y = np.random.multivariate_normal(mean, cov, 80).T
ax = sns.regplot(x=x, y=y, color="g", marker="+")

这里写图片描述

# 控制回归的置信度,你会看到拟合直线的外面的面积的有变化的
ax = sns.regplot(x=x, y=y, ci=68)

这里写图片描述

# 上面的都是拟合一次曲线,拟合二次曲线通过order=2设置,
# 拟合一次曲线相当于 order=1
ans = sns.load_dataset("anscombe")
ax = sns.regplot(x="x", y="y", data=ans.loc[ans.dataset == "II"],scatter_kws={"s": 80},order=2, ci=None, truncate=True)

这里写图片描述
5.数值分布绘图
5.1.直方图histplot

# 绘制数值变量的密度分布图
# 默认既绘制核密度曲线,也绘制直方图
import seaborn as sns, numpy as np
sns.set(rc={"figure.figsize": (8, 4)}); np.random.seed(0)
x = np.random.randn(100)
ax = sns.distplot(x)

这里写图片描述

# 只绘制核密度曲线,不绘制直返图
ax = sns.distplot(x, rug=True, hist=False)

这里写图片描述

# 横着放
ax = sns.distplot(x, vertical=True)

这里写图片描述
5.2.核密度图kdeplot

# 绘制核密度图
import numpy as np; np.random.seed(10)
import seaborn as sns; sns.set(color_codes=True)
mean, cov = [0, 2], [(1, .5), (.5, 1)]
x, y = np.random.multivariate_normal(mean, cov, size=50).T
ax = sns.kdeplot(x)

这里写图片描述

# shade参数决定是否填充曲线下面积
ax = sns.kdeplot(x, shade=True, color="r")

这里写图片描述

# 双变量密度图,相当于等高线图了
# shade 参数改用颜色深浅表示密度的大小,不过不用,就真的是等高线了
ax = sns.kdeplot(x, y, shade=True)

这里写图片描述

# 分组绘制双变量的核密度图
# 相当于绘制两个核密度图,通过图可以看到密度中心
# 类似于挖掘算法中聚类中心绘图
iris = sns.load_dataset("iris")
setosa = iris.loc[iris.species == "setosa"]  # 组1
virginica = iris.loc[iris.species == "virginica"]  # 组2

ax = sns.kdeplot(setosa.sepal_width, setosa.sepal_length, cmap="Reds", shade=True, shade_lowest=False)

ax = sns.kdeplot(virginica.sepal_width, virginica.sepal_length, cmap="Blues", shade=True, shade_lowest=False)

这里写图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值