seaborn 常用画图
python seaborn畫圖
以前覺得用markdown寫圖文混排的文字應該很麻煩,后來發現CSDN的markdown真是好用的。
在做分析時候,有時需要畫幾個圖看看數據分布情況,但總記不住python的繪圖函數。今天有空順便整理下python的seaborn繪圖函數庫。
Seaborn其實是在matplotlib的基礎上進行了更高級的API封裝,從而使得作圖更加容易,在大多數情況下使用seaborn就能做出很具有吸引力的圖,而使用matplotlib能制作具有更多特色的圖。應該把Seaborn視為matplotlib的補充,而不是替代物。
seaborns是針對統計繪圖的,方便啊。
一般來說,seaborn能滿足數據分析90%的繪圖需求,夠用了,如果需要復雜的自定義圖形,還是要matplotlit。這里也只是對seaborn官網的繪圖API簡單翻譯整理下,對很多參數使用方法都沒有說到,如果需要精細繪圖,還是需要參照其seaborn的文檔的。
這里簡要介紹常用的圖形,常用的參數,其精美程度不足以當做報告繪圖,算是做筆記吧。
1.幾個概念
如果使用過R語言的ggplot2繪圖包,對分組分面,統計繪圖等概念應該很熟悉,這里也介紹下。
1.1.分組繪圖
比如說需要在一張圖上繪制兩條曲線,分別是南方和北方的氣溫變化,分別用不同的顏色加以區分。在seaborn中用hue參數控制分組繪圖。
1.2.分面繪圖
其實就是在一張紙上劃分不同的區域,比如2*2的子區域,在不同的子區域上繪制不同的圖形,在matplotlib中就是 add_subplot(2,2,1),在seaborn中用col參數控制,col的全稱是columns,不是color,如果輔助col_wrap參數會更好些。后來發現,col可以控制columns的子圖,那么row可以控制rows的子圖排列。
如果需要分面繪圖,應該使用seaborn的FacetGrid對象,seaborn的一般的繪圖函數是沒有分面這個參數的。
1.3.統計函數
分組繪圖的時候,會對分組變量先要用統計函數,然后繪圖,比如先計算變量的均值,然后繪制該均值的直方圖。統計繪圖參數是 estimator,很多情況下默認是numpy.mean。在ggplot2中就大量使用了這種方法。如果不適用統計繪圖,就需要先用pandas進行groupby分組匯總,然后用seaborn繪圖,多此一舉了。
2.圖形分類
在seaborn中圖形大概分這么幾類,因子變量繪圖,數值變量繪圖,兩變量關系繪圖,時間序列圖,熱力圖,分面繪圖等。
因子變量繪圖
箱線圖boxplot
小提琴圖violinplot
散點圖striplot
帶分布的散點圖swarmplot
直方圖barplot
計數的直方圖countplot
兩變量關系圖factorplot
回歸圖
回歸圖只要探討兩連續數值變量的變化趨勢情況,繪制x-y的散點圖和回歸曲線。
線性回歸圖lmplot
線性回歸圖regplot
分布圖
包括單變量核密度曲線,直方圖,雙變量多變量的聯合直方圖,和密度圖
熱力圖
聚類圖
時間序列圖
分面繪圖
1.分面繪圖FacetGrid
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”])
1
2
3
4
5
6
7
這里寫圖片描述
分組繪制箱線圖,分組因子是day,在x軸不同位置繪制
ax = sns.boxplot(x=“day”, y=“total_bill”, data=tips)
1
2
這里寫圖片描述
分組箱線圖,分子因子是smoker,不同的因子用不同顏色區分
相當于分組之后又分組
ax = sns.boxplot(x=“day”, y=“total_bill”, hue=“smoker”,
data=tips, palette=“Set3”)
1
2
3
4
這里寫圖片描述
改變線寬,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”])
1
2
3
4
5
6
7
對dataframe的每個變量都繪制一個箱線圖,水平放置
iris = sns.load_dataset(“iris”)
ax = sns.boxplot(data=iris, orient=“h”, palette=“Set2”)
1
2
3
這里寫圖片描述
箱線圖+有分布趨勢的散點圖–>的組合圖
箱線圖+有分布趨勢的散點圖
圖形組合也就是兩條繪圖語句一起運行就可以了,相當于圖形覆蓋了
ax = sns.boxplot(x=“day”, y=“total_bill”, data=tips)
ax = sns.swarmplot(x=“day”, y=“total_bill”, data=tips, color=".25")
1
2
3
4
這里寫圖片描述
3.2.violinplot小提琴圖
小提琴圖其實是箱線圖與核密度圖的結合,箱線圖展示了分位數的位置,小提琴圖則展示了任意位置的密度,通過小提琴圖可以知道哪些位置的密度較高。在圖中,白點是中位數,黑色盒型的范圍是下四分位點到上四分位點,細黑線表示須。外部形狀即為核密度估計(在概率論中用來估計未知的密度函數,屬于非參數檢驗方法之一)。
import seaborn as sns
sns.set_style(“whitegrid”)
tips = sns.load_dataset(“tips”)
繪制小提琴圖
ax = sns.violinplot(x=tips[“total_bill”])
1
2
3
4
5
這里寫圖片描述
分組的小提琴圖,同上面的箱線圖一樣通過X軸分組
ax = sns.violinplot(x=“day”, y=“total_bill”, data=tips)
1
2
這里寫圖片描述
通過hue分組的小提琴圖,相當于分組之后又分組
ax = sns.violinplot(x=“day”, y=“total_bill”, hue=“smoker”,
data=tips, palette=“muted”)
1
2
3
這里寫圖片描述
分組組合的小提琴圖,其實就是hue分組后,各取一半組成一個小提琴圖
ax = sns.violinplot(x=“day”, y=“total_bill”, hue=“smoker”,
data=tips, palette=“muted”, split=True)
1
2
3
這里寫圖片描述
調整x軸順序,同樣通過order參數
ax = sns.violinplot(x=“time”, y=“tip”, data=tips,
order=[“Dinner”, “Lunch”])
1
2
3
這里寫圖片描述
其他的樣式不常用,就不貼上來了。
3.3.stripplot散點圖
需要注意的是,seaborn中有兩個散點圖,一個是普通的散點圖,另一個是可以看出分布密度的散點圖。下面把它們花在一起就明白了。
普通的散點圖
ax1 = sns.stripplot(x=tips[“total_bill”])
帶分布密度的散點圖
ax2 = sns.swarmplot(x=tips[“total_bill”])
1
2
3
4
這里寫圖片描述
分組的散點圖
ax = sns.stripplot(x=“day”, y=“total_bill”, data=tips)
1
2
這里寫圖片描述
添加抖動項的散點圖,jitter可以是0.1,0.2…這樣的小數,表示抖動的程度大小
ax = sns.stripplot(x=“day”, y=“total_bill”, data=tips, jitter=True)
1
2
這里寫圖片描述
是不是想橫著放呢,很簡單的,x-y順序換一下就好了
ax = sns.stripplot(x=“total_bill”, y=“day”, data=tips,jitter=True)
1
2
這里寫圖片描述
重點來了,分組繪制,而且是分組后分開繪制,在柱狀圖中,跟分組柱狀圖類似的。
通過 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)
1
2
3
4
5
6
7
8
這里寫圖片描述
這里寫圖片描述
散點圖+小提起圖
兩條命令一起運行就行了
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)
1
2
3
4
這里寫圖片描述
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”])
1
2
3
4
這里寫圖片描述
分組的散點圖
ax = sns.swarmplot(x=“day”, y=“total_bill”, data=tips)
1
2
這里寫圖片描述
箱線圖+散點圖
whis 參數設定是否顯示箱線圖的離群點,whis=np.inf 表示不顯示
ax = sns.boxplot(x=“tip”, y=“day”, data=tips, whis=np.inf)
ax = sns.swarmplot(x=“tip”, y=“day”, data=tips)
1
2
3
4
這里寫圖片描述
小提琴圖+散點圖
ax = sns.violinplot(x=“day”, y=“total_bill”, data=tips, inner=None)
ax = sns.swarmplot(x=“day”, y=“total_bill”, data=tips,
color=“white”, edgecolor=“gray”)
1
2
3
4
這里寫圖片描述
3.5.pointplot
Show point estimates and confidence intervals using scatter plot glyphs.
使用散點圖符號顯示點估計和置信區間。
這個我不知道在什么地方用到,不太明白。就先寫這個了。
3.6.barplot直方圖
我不喜歡顯示直方圖上面的置信度線,難看,所以下面的圖形我都設置ci=0.(Size of confidence intervals to draw around estimated values)
直方圖的統計函數,繪制的是變量的均值 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)
1
2
3
4
5
這里寫圖片描述
分組的柱狀圖
ax = sns.barplot(x=“day”, y=“total_bill”, hue=“sex”, data=tips,ci=0)
1
2
這里寫圖片描述
繪制變量中位數的直方圖,estimator指定統計函數
from numpy import median
ax = sns.barplot(x=“day”, y=“tip”, data=tips,
estimator=median, ci=0)
1
2
3
4
這里寫圖片描述
改變主題顏色
palette=“Blues_d”
ax = sns.barplot(“size”, y=“total_bill”, data=tips,
palette=“Blues_d”)
1
2
3
4
這里寫圖片描述
3.7.countplot計數統計圖
這個很重要,對因子變量計數,然后繪制條形圖
import seaborn as sns
sns.set(style=“darkgrid”)
titanic = sns.load_dataset(“titanic”)
ax = sns.countplot(x=“class”, data=titanic)
1
2
3
4
這里寫圖片描述
分組繪圖
ax = sns.countplot(x=“class”, hue=“who”, data=titanic)
如果是橫著放,x用y替代
ax = sns.countplot(y=“class”, hue=“who”, data=titanic)
1
2
3
4
5
這里寫圖片描述
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”)
1
2
3
4
5
6
這里寫圖片描述
不同的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)
1
2
3
4
5
這里寫圖片描述
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)
1
2
3
4
這里寫圖片描述
分組的線性回歸圖,通過hue參數控制
g = sns.lmplot(x=“total_bill”, y=“tip”, hue=“smoker”, data=tips)
1
2
這里寫圖片描述
分組繪圖,不同的組用不同的形狀標記
g = sns.lmplot(x=“total_bill”, y=“tip”, hue=“smoker”,
data=tips,markers=[“o”, “x”])
1
2
3
這里寫圖片描述
不僅分組,還分開不同的子圖繪制,用col參數控制
g = sns.lmplot(x=“total_bill”, y=“tip”, col=“smoker”, data=tips)
1
2
這里寫圖片描述
col+hue 雙分組參數,既分組,又分子圖繪制,jitter控制散點抖動程度
g = sns.lmplot(x=“size”, y=“total_bill”, hue=“day”,
col=“day”,data=tips, aspect=.4, x_jitter=.1)
1
2
3
這里寫圖片描述
分組繪制,控制size尺寸
g = sns.lmplot(x=“total_bill”, y=“tip”, col=“day”, hue=“day”,
data=tips, col_wrap=2, size=3)
1
2
3
這里寫圖片描述
既然col可以控制分組子圖的,那么row也是可以控制分組子圖的
g = sns.lmplot(x=“total_bill”, y=“tip”, row=“sex”,
col=“time”, data=tips, size=3)
1
2
3
這里寫圖片描述
4.2.回歸圖regplot
Plot the relationship between two variables in a DataFrame:
import seaborn as sns; sns.set(color_codes=True)
tips = sns.load_dataset(“tips”)
ax = sns.regplot(x=“total_bill”, y=“tip”, data=tips)
1
2
3
這里寫圖片描述
控制散點的形狀和顏色
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="+")
1
2
3
4
5
這里寫圖片描述
控制回歸的置信度,你會看到擬合直線的外面的面積的有變化的
ax = sns.regplot(x=x, y=y, ci=68)
1
2
這里寫圖片描述
上面的都是擬合一次曲線,擬合二次曲線通過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)
1
2
3
4
5
這里寫圖片描述
5.數值分布繪圖
5.1.直方圖histplot
直方圖hist=True,核密度曲線rug=True
繪制數值變量的密度分布圖
默認既繪制核密度曲線,也繪制直方圖
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)
1
2
3
4
5
6
這里寫圖片描述
只繪制核密度曲線,不繪制直返圖
ax = sns.distplot(x, rug=True, hist=False)
1
2
這里寫圖片描述
橫著放
ax = sns.distplot(x, vertical=True)
1
2
這里寫圖片描述
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)
1
2
3
4
5
6
這里寫圖片描述
shade參數決定是否填充曲線下面積
ax = sns.kdeplot(x, shade=True, color=“r”)
1
2
這里寫圖片描述
雙變量密度圖,相當于等高線圖了
shade 參數改用顏色深淺表示密度的大小,不過不用,就真的是等高線了
ax = sns.kdeplot(x, y, shade=True)
1
2
3
這里寫圖片描述
分組繪制雙變量的核密度圖
相當于繪制兩個核密度圖,通過圖可以看到密度中心
類似于挖掘算法中聚類中心繪圖
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
2
3
4
5
6
7
8
9
10
11
12
這里寫圖片描述
5.3.雙變量關系圖jointplot
joint,顧名思義,就是聯合呀。
Draw a plot of two variables with bivariate and univariate graphs.
kind參數可以使用不同的圖形反應兩變量的關系,比如點圖,線圖,核密度圖。
默認繪制雙變量的散點圖,計算兩個變量的直方圖,計算兩個變量的相關系數和置信度
import numpy as np, pandas as pd; np.random.seed(0)
import seaborn as sns; sns.set(style=“white”, color_codes=True)
tips = sns.load_dataset(“tips”)
g = sns.jointplot(x=“total_bill”, y=“tip”, data=tips)
1
2
3
4
5
這里寫圖片描述
通過kind參數,除了繪制散點圖,還要繪制擬合的直線,擬合的核密度圖
g = sns.jointplot(“total_bill”, “tip”, data=tips, kind=“reg”)
1
2
這里寫圖片描述
使用六角形代替點圖圖
g = sns.jointplot(“total_bill”, “tip”, data=tips, kind=“hex”)
1
2
這里寫圖片描述
繪制核密度圖
iris = sns.load_dataset(“iris”)
g = sns.jointplot(“sepal_width”, “petal_length”, data=iris,
kind=“kde”, space=0, color=“g”)
1
2
3
4
這里寫圖片描述
控制圖形的大小和顏色
g = sns.jointplot(“total_bill”, “tip”, data=tips,
size=5, ratio=3, color=“g”)
1
2
3
這里寫圖片描述
5.4.變量關系組圖pairplot
就是繪制dataframe中各個變量兩兩之間的關系圖。
在變量關系圖中,最常見的就是 x-y的線圖,x-y的散點圖,x-y的回歸圖。其實這三者都可以通過lmplot繪制,只是控制不同的參數而已。x-y的線圖,其實就是時間序列圖,這里就不說了。
這里又說一遍散點圖,是為了和前面的因子變量散點圖相區分,前面的因子變量散點圖,講的是不同因子水平的值繪制的散點圖,而這里是兩個數值變量值散點圖關系。為什么要用lmplot呢,說白了就是,先將這些散點畫出來,然后在根據散點的分布情況擬合出一條直線。但是用lmplot總覺得不好,沒有用scatter來得合適。
x-y 的散點圖,不畫回歸線,fit_reg=False
tips = sns.load_dataset(“tips”)
g = sns.lmplot(x=“total_bill”, y=“tip”, data=tips,
fit_reg=False,hue=‘smoker’,scatter=True)
只畫回歸線,不畫散點圖,scatter=False
g = sns.lmplot(x=“total_bill”, y=“tip”, data=tips,
fit_reg=True,hue=‘smoker’,scatter=False)
1
2
3
4
5
6
7
8
9
這里寫圖片描述
這里寫圖片描述
import seaborn as sns; sns.set(style=“ticks”, color_codes=True)
iris = sns.load_dataset(“iris”)
g = sns.pairplot(iris)
1
2
3
這里寫圖片描述
分組的變量關系圖,似乎很厲害啊
g = sns.pairplot(iris, hue=“species”)
1
2
這里寫圖片描述
hue 分組后,不同的組用不同的形狀標記
g = sns.pairplot(iris, hue=“species”, markers=[“o”, “s”, “D”])
1
2
這里寫圖片描述
當然也可以只取dataframe中的一部分變量繪圖
g = sns.pairplot(iris, vars=[“sepal_width”, “sepal_length”])
1
2
這里寫圖片描述
對角線默認繪制直方圖,當然也可以繪制核密度圖
g = sns.pairplot(iris, diag_kind=“kde”)
相應的,兩變量關系圖,也可以繪制線性回歸圖
1
2
3
這里寫圖片描述
這里寫圖片描述
6.熱力圖
6.1.熱力圖heatmap
import numpy as np; np.random.seed(0)
import seaborn as sns; sns.set()
uniform_data = np.random.rand(10, 12)
ax = sns.heatmap(uniform_data)
1
2
3
4
這里寫圖片描述
改變顏色映射的值范圍
ax = sns.heatmap(uniform_data, vmin=0, vmax=1)
1
2
這里寫圖片描述
Plot a dataframe with meaningful row and column labels:
繪制x-y-z的熱力圖,比如 年-月-銷量 的熱力圖
flights = sns.load_dataset(“flights”)
flights = flights.pivot(“month”, “year”, “passengers”)
ax = sns.heatmap(flights)
1
2
3
4
5
這里寫圖片描述
繪制熱力圖,還要將數值寫到熱力圖上
ax = sns.heatmap(flights, annot=True, fmt=“d”)
1
2
這里寫圖片描述
這個圖在繪制缺失值分布有用,但是不知道怎么樣。
Plot every other column label and don’t plot row labels
data = np.random.randn(50, 20)
ax = sns.heatmap(data, xticklabels=2, yticklabels=False)
1
2
3
4
這里寫圖片描述
7.聚類圖clustermap
暫時不知道怎么用,先這樣吧。
8.時間序列圖
tsplot函數說是繪制時間序列圖,還不如說是繪制簡單的線圖更加合適吧,因為我在繪制帶timestap時間索引的pandas.Series時,并沒有自動升采樣繪圖,只是數據有有什么數據就畫什么,這在時間序列上應該是不對的。
因為我遇到這樣一種情況,一個產品只在上半年賣,從數據庫中取出數據只有每年上半年的數據,下半年沒有數據也應該填充為0才對啊,但是seaborn的tsplot沒有這個功能。
下面先介紹tsplot繪制線圖吧,傳入一個list或者series,直接繪制線圖。
8.1.tsplot時序圖
Plot a trace with translucent confidence bands:
繪制帶有半透明置信帶的軌跡:
data是多組list的組合,這時候應該繪制多條曲線才對啊,其實不是的,是多組list的均值的序列圖(默認)
import numpy as np; np.random.seed(22)
import seaborn as sns; sns.set(color_codes=True)
x = np.linspace(0, 15, 31)
data = np.sin(x) + np.random.rand(10, 31) + np.random.randn(10, 1)
ax = sns.tsplot(data=data)
1
2
3
4
5
6
7
8
這里寫圖片描述
tsplot的參數不太懂,直接上圖吧
gammas = sns.load_dataset(“gammas”)
ax = sns.tsplot(time=“timepoint”, value=“BOLD signal”,
unit=“subject”, condition=“ROI”, data=gammas)
1
2
3
4
這里寫圖片描述
繪制不同的置信度擬合圖,這個好用
ax = sns.tsplot(data=data, ci=[68, 95], color=“m”)
1
2
這里寫圖片描述
使用不同的統計函數,默認的是均值,這里是中位數
ax = sns.tsplot(data=data, estimator=np.median)
1
2
這里寫圖片描述
8.2.panda線圖
pandas的dataframe本身也有繪圖函數,對于常見的分析圖形還是很方便的,而且可以在plot函數中指定title等
sale4.loc[sale4[‘sku’]==‘SKU412946’,[‘month’,‘salecount’]]
.plot(x=‘month’,y=‘salecount’,title=‘SKU412946’)
1
2
這里寫圖片描述
8.3.采樣的時序圖
這里重點講一下。如果時序中每天的數據都有還好說,如果沒有,就需要采樣了。
def plot_ts_day(x,y):
“”“繪制每天的時間序列圖。
需要注意的是,序列是不是連續的,也就是說某天的數據是沒有的,因此需要采樣至每天都有記錄,原來數據沒有的就填充0
x:時間軸,string或者time類型,是一個seires
y:值
“””
# x轉成時間類型Timestamp,y也轉成list
x=[pd.to_datetime(str(i)) for i in x]
y=[i for i in y]
s=pd.Series(y,index=x)
s = s.resample(rule=‘D’,fill_method=‘ffill’) # 生采樣沒有的會被填充
# 原來沒有的就填充為0
s[s.index]=0
s[x]=y
# 重建索引,畫出來的圖好看點
x2 = [i.strftime(’%Y-%m-%d’) for i in s.index]
s.index = x2
# 畫圖,這里使用series的plot函數,而不是seaborn.tsplot函數
s.plot()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
這里寫圖片描述
def plot_ts_month(x,y):
“”“繪制月的時間序列圖,每月一個數據點,而不是每天一個”""
# 將x轉成時間類型timestamp,y也轉成list
try:
x = [pd.to_datetime(str(i)) for i in x]
except:
x=[pd.to_datetime(str(i)+‘01’) for i in x]
y=[i for i in y]
#
s=pd.Series(y,index=x)
# 降采樣至月
s = s.resample(‘M’, label=‘right’).sum().fillna(0)
# 重建索引,這樣畫出來的圖好看點
s.index=[i.strftime(’%Y%m’) for i in s.index]
s.plot()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
這里寫圖片描述
8.4.pandas分組的線圖
說實話,到現在還沒搞懂怎么用sns.tsplot繪制分組線圖,但是任務緊急,就用pandas的dataframe自帶方法plot來繪圖了,其實也挺簡單的。
主要注意的是,盡量給dataframe或者series建立時間索引,不然x軸很難看的。
繪制月銷量圖
數據如下
year month2 salecount
2014 1 531
2014 2 505
建立索引,‘201601’
data.index = data[‘year’].map(str)+data[‘month2’].map(lambda x: str(x) if x>=10 else ‘0’+str(x))
繪圖,其實也就是和8.3的方法一致了
data[‘salecount’].plot()
1
2
3
4
5
6
7
8
9
10
分組的線圖,比如seaborn中的hue參數,方法是,先將dataframe長表格式轉成寬表格式(透視表),每列是不同的年。
分組的線圖
轉成透視表后,繪圖
data.pivot(index=‘month2’,columns=‘year’,values=‘salecount’).plot(title=‘銷量’)
當數據很大的時候,你想繪制分組的統計圖,比如將不同產品,相同的年月的銷量進行加或者均值后在繪制線圖
使用 aggfunc 參數即可,默認是mean
data.pivot_table(index=‘month2’,columns=‘year’,values=‘salecount’,aggfunc=‘sum’)
.plot(title=‘銷量’,style=‘o-’)
1
2
3
4
5
6
7
8
這里寫圖片描述
圖形格式選項
圖形參數
style
圖形的屬性
1.color:顏色
1.1 r:紅色
1.2 b:藍色
1.3 g:綠色
1.3 y:黃色
2.數據標記markder
2.1 o:圓圈
2.2 .:圓點
2.2 d:棱形
3.線型linestyle
3.1 沒有參數的話就是默認畫點圖
3.2 --:虛線
3.3 -:實線
4.透明度
alpha
5.大小
size
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
繪 “點-線” 圖
data.pivot(index=‘month2’,columns=‘year’,values=‘salecount’)
.plot(title=‘銷量’,style=’-o’)
1
2
3
這里寫圖片描述
9.雙坐標軸圖
有沒有遇到這樣一種情況,需要將銷量和趨勢圖和溫度的變化圖同時畫在一幅圖上,以便觀察兩者的趨勢變化情況,但是因兩者是數值差距很大,如果共用同一Y軸,溫度曲線就基本看不到了。還是上圖上代碼吧。
import seaborn as sns
sale=pd.Series(np.random.random(10)*100).map(int)
tmperature=pd.Series(np.random.random(10)*10).map(int)
ax=plt.subplot(111)
sale.plot(ax=ax,color=‘b’)
ax.set_xlabel(‘time’)
ax.set_ylabel(‘sale’)
重點來了,twinx 或者 twiny 函數
ax2 = ax.twinx()
tmperature.plot(ax=ax2,color=‘r’)
ax2.set_ylabel(‘tmperature’)
plt.title(‘double series figure’)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
這里寫圖片描述
9.一些技巧
9.1 批量保存圖片
如果只有一張圖片,這沒什么好說的,但是如果要對每個維度繪圖,然后保存圖片呢。
fig = plt.figure()
ax=fig.add_subplot(111)
sub_data[years].plot(ax=ax, style=‘o-’,title=’%s 月銷量趨勢圖’%lev3)
file = r’E:\服裝預測\銷量趨勢-%s.jpg’ %lev3
savefig(file)
time.sleep(0.5) # 注意這里要暫停一下,不然會出問題的
plt.close() # 最后記得關閉句柄
1
2
3
4
5
6
7
9.2 顯示中文問題
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.pyplot import savefig
mpl.rcParams[‘font.sans-serif’] = [‘SimHei’] # 指定默認字體
mpl.rcParams[‘axes.unicode_minus’] = False # 解決保存圖像是負號’-'顯示為方塊的問題
1
2
3
4
5
6
7
8
10.分段統計繪圖
遇到這樣一種情況,如下的數據格式,現在platform不是重點,需要對diff_date字段分段匯總然后繪圖。
platform age cnt
2 0 22
2 0 40
4 0.1 47
5 0.1 48
3 0.1 51
1
2
3
4
5
6
這里借用panas.cut函數,因為是繪圖看趨勢,不需要精確得到每個分段的分割點。
cut函數有兩種使用方法,如果bins=10這樣的數值,則將series切成等間隔的10段,如果bins=[0,5,20,55…]這樣的一個列表,則根據列表規則切分。
先用pd.cut分段,并取出分段數值
通過 precision 控制小數的位數
data[‘cut_point’]=pd.cut(data[‘age’],
bins=[0,3,5.9,8.9,11.9,14.8,17.8,20.8,23.8,26.7,29.7], # 分割點
labels=[‘0-3’,‘3-5.9’,…] # 區間命名
right=True, # 區間默認是坐開右閉
precision=1)
用sns畫圖,可以直接匯總每個分段的數量后繪圖,而不需要groupby匯總
相當于回到前面,用barplot繪圖
sns.barplot(x=‘cut_point’,y=‘cnt’, data=data, estimator=np.sum, ci=0)
plt.xlabel(‘這是橫坐標名稱’)
plt.ylabel(‘這是縱坐標名稱’)
plt.title(‘這是圖標標題’)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
這里寫圖片描述
11.分面子圖繪圖
11.1
接下來好好說說這個比較難的,在10中我們分區間繪圖,但是我們沒有考慮platform這個因子變量啊,如果我們要考慮這個因子變量,就需要分面了,比如不同的platform畫一個子圖。
和上面的一樣,先分組取出分割點
用pd.cut分段,并取出分段數值,通過 precision 控制小數的位數
data[‘bins’]=pd.cut(data[‘age’], bins=10,precision=1)
取出分割點,因為cut后得到的是 ‘(2.99, 5.97]’ 這樣的字符串
data[‘cut_point’]=data[‘bins’].apply(lambda x: eval(x.replace(’]’,’)’))[1])
下面重點來了,用FacetGrid進行子圖繪制
g=sns.FacetGrid(data=data,col=‘platform’,col_wrap=3,size=5) # 這里相當于groupby
g=g=g.map(sns.barplot,‘cut_point’,‘cnt’,ci=0, estimator=np.sum)
很奇怪的是,如果寫
g=g.map(sns.barplot,x=‘cut_point’,y=‘cnt’,ci=0, estimator=np.sum)就報錯。
1
2
3
4
5
6
7
8
9
10
11
12
這里寫圖片描述
11.2
自定義子圖繪制
def my_barplot(x,y,**kwargs):
“”"
自定義函數的時候,沒有顯示傳入dataframe,但是會自動獲取,很神奇吧。
x,y是dataframe的列名
“”"
ax = plt.gca() # 這個是重點,獲取對應的ax子圖句柄
data[‘bins’]=pd.cut(data[‘age’], bins=10,precision=1)
data[‘cutpoint’]=data[‘bins’].apply(lambda x: eval(x.replace(’]’, ‘)’))[1])
sns.barplot(x=‘cutpoint’, y=‘cnt’,data=data, estimator=np.sum, ci=0, ax=ax)
g = sns.FacetGrid(data=data, col=‘platform’,col_wrap=3,
size=5,sharex=False)
g = g.map(my_barplot,‘age’,‘cnt’)
1
2
3
4
5
6
7
8
9
10
11
12
13
這里寫圖片描述
12.顏色主題
主題
在換了win10后發現seaborn的畫出來的圖很難看,基本上就是matplotlib的樣子。想來肯定是主題和顏色樣式沒有設置好。今天看了下文檔,補充下主題的設置。
seaborn的默認主題就是最好看的,如下:
import seaborn as sns
sns.set() # 恢復默認主題,在win10中開始的時候要執行一次。
1
2
還有其他幾個主題,包括:
sns.set_style(“whitegrid”) # 白色網格背景
sns.set_style(“darkgrid”) # 灰色網格背景
sns.set_style(“dark”) # 灰色背景
sns.set_style(“white”) # 白色背景
sns.set_style(“ticks”) # 四周加邊框和刻度
1
2
3
4
5
下面來幾張圖,發現就默認主題和白色網格背景是比較好看。
這里寫圖片描述
這里寫圖片描述
這里寫圖片描述
顏色
顏色一般來說用默認的顏色就好了,而且也比較好看,如果非要設置顏色,可以通過sns.set_palette(“husl”)設置。
常用的其他顏色模式還有:
sns.set_palette(“muted”) # 常用
sns.set_palette(“RdBu”)
sns.set_palette(“Blues_d”)
sns.set_palette(“Set1”)
sns.set_palette(“RdBu”)
1
2
3
4
5
效果如下圖:
這里寫圖片描述
這里寫圖片描述
這里寫圖片描述
這里寫圖片描述
這里寫圖片描述
13.后話
這里只是簡單說說seaborn常用的繪圖函數而已,看seaborn官網上面有很多好看的圖形樣例,而這里的函數畫出來的哪里有官網的好看啊。
而且這里也沒有說到具體的布局控制,顏色主題等,要想繪制精美的圖形,還需要學習具體的參數設定啊。
不過這里提到的這些簡要圖形,對于普通的分析快速繪圖足夠用了
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的seaborn 常用画图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记——数据可视化03(饼图、圆环图、箱
- 下一篇: linux g++ 关闭 ‘typede