Python數(shù)據(jù)可視化-Seaborn(含組合圖)

Seaborn是一個很好用的python數(shù)據(jù)可視化包。匯總一下之前做數(shù)據(jù)可視化時的一些注意事項和技巧焕议。


Seaborn

為什么有的數(shù)據(jù)可視化給人感覺起來很好看很舒服别瞭,其實涉及到Seaborn的一些細節(jié)操作問題嗤瞎,這里收集了我所關(guān)注到的注意事項虹菲。

文章結(jié)構(gòu)如下:

  1. Seaborn依賴的數(shù)據(jù)結(jié)構(gòu)
  2. Matplotlib
  3. Heatplot
  4. Jointplot
  5. Violinplot
  6. 組合圖(plt.plot+sns.heatplot)
    (1) 組合圖的框架
    (2) 子圖配置——heatplot
    (3) 子圖配置——ax.plot
    (4) 其他

1. Seaborn依賴的數(shù)據(jù)結(jié)構(gòu)

在使用Seaborn之前霎褐,需要強調(diào)和注意的是Seaborn依賴的數(shù)據(jù)結(jié)構(gòu)。pandas的dataframe可以很方便地兼容Seaborn的數(shù)據(jù)輸入拍埠。下面簡單介紹從csv文件導(dǎo)入dataframe數(shù)據(jù)以及一些相關(guān)的處理:

import pandas as pd
dataframe = pd.read_csv(filedir, usecols=[colsname])  #  read data from csv file
dataframe.drop() 
dataframe.iloc[]

這里需要說明的是棉圈,對于dataframe數(shù)據(jù)胎围,習(xí)慣上提前給列命名,方便之后Seaborn的使用德召,當(dāng)然也可以在Seaborn中重新命名白魂。

2. Matplotlib

Matplotlib可以很好的兼容Seaborn,可以通過Matplotlib對圖片尺寸進行修改上岗、ticklable及title等編輯福荸、保存圖片以及多個Seaborn子圖的排列方式和尺寸進行編輯,同時肴掷,也可以實現(xiàn)Seaborn和Matplotlib共同作圖敬锐。

(1) 圖片尺寸

# 方法一
import matplotlib.pyplot as plt
f, ax = plt.subplots(figsize=(11, 9))
# 方法二
import pylab
pylab.rcParams['figure.figsize'] = (12.0,7.0) # 顯示大小

(2) 圖片標(biāo)注及字體大小

import matplotlib.pyplot as plt
plt.xticks(fontsize=13)
plt.yticks(fontsize=13)
plt.xlim([0,4000])
plt.legend(['line1,'line2','line3'],fontsize=17)
plt.xlabel('x',fontsize=17)
plt.ylabel('y',fontsize=17)
plt.title('title', fontsize=20)

(3) 保存圖片

plt.savefig(filename+".png",format='png', bbox_inches='tight', transparent=True)

3. Heatplot

cmap = sns.diverging_palette(220, 10, as_cmap=True)
rc = {'font.size': 15, 'xtick.labelsize': 15, 'ytick.labelsize': 15}
sns.set(rc=rc)
# Draw the heatmap with the mask and correct aspect ratio
heatplt = sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,
            square=True, linewidths=.5, cbar_kws={"shrink": .5}, annot=True, fmt=".2f")
Heatmap.png

其中,cmap可以定制heatmap的顏色呆瞻,seaborn的heatmap當(dāng)中的fmt參數(shù)可以修改顯示數(shù)字的位數(shù)台夺,例如".2f"表示float類型保留小數(shù)點后兩位。

4. Jointplot

sns.jointplot(x=x, y=y, kind="hex",color='r')
Jointplot.png

5. Violinplot

vio = sns.violinplot(data=Error, orient="v",linewidth=0.6)
for i in range(4):
    plt.vlines(1.5+2*(i), -0.35, 0.35, colors = "c", linestyles = "dashed")

Violinplot

6. 組合圖

很多時候在描述一個問題時需要對不同的圖進行組合以達到表現(xiàn)的目的栋烤,例如將plt的曲線圖和seaborn的heatplot組合起來谒养,并且橫軸相對應(yīng),標(biāo)注要清楚可見。


組合圖結(jié)構(gòu)

這個時候需要根據(jù)以下步驟有條不紊地對圖進行設(shè)置买窟。

(1) 組合圖的框架

首先確認你的圖片當(dāng)中包含幾塊丰泊,例如如果包含兩塊,那么分別的尺寸以及比例是怎樣的始绍。

fig = plt.figure(figsize=(xSize, ySize))
gs = gridspec.GridSpec(2, 1, height_ratios=[3, 1])

比如瞳购,如上代碼是做了一個兩行一列的結(jié)構(gòu),并且縱向比例是3:1亏推,整個圖片的大小是(xSize, ySize)学赛。

ax0 = plt.subplot(gs[0])
ax1 = plt.subplot(gs[1])

而subplot使用了gs為參數(shù),確定了子圖的句柄吞杭,可以通過對ax0或者ax1進行操作盏浇,以達到不同位置顯示不同的圖像的目的。

(2) 子圖配置——heatplot

在子圖當(dāng)中芽狗,我們首先對heatplot進行操作绢掰,

heatplt = sns.heatmap(data, linewidths=0, ax=ax1, cmap="YlGnBu", annot=False,
                          yticklabels=['data'], xticklabels=xtick,
                          cbar=False)

注意點-1:

因為考慮到需要將heatplot的橫軸與plt的曲線圖橫軸對齊,所以關(guān)閉圖例顯示童擎,當(dāng)然也可以將圖例與橫軸平行放置滴劲,但是為了美觀,這里我關(guān)掉了cbar的顯示顾复。

注意點-2:

對于橫軸較為密集的情況下班挖,例如是一個很長的時間段,需要對橫軸進行間隔標(biāo)注顯示芯砸,這樣給人看起來很清楚萧芙,不會因為密密麻麻擠在一起導(dǎo)致看不清的問題。所以使用如下的配置:

import matplotlib.ticker as ticker
ax1.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))

tick_spacing是可以修改的參數(shù)乙嘀,顧名思義末购,是標(biāo)注間隔的意思破喻,這里需要注意虎谢,tick_spacing需要和給定的標(biāo)注序列統(tǒng)一,舉個例子曹质,比如現(xiàn)在需要給橫軸標(biāo)注1到100婴噩,共100個數(shù)字,但是由于太過密集羽德,需要用到tick_spacing參數(shù)進行稀疏標(biāo)注几莽,那么在給heatplot的xticklabels傳遞參數(shù)時,就必須根據(jù)tick_spacing對序列進行系數(shù)處理宅静,親測如下代碼無誤:(僅限配置heatplot)

SliceStart = 0
SliceEnd = len(data)
tick_spacing = 10
xtick=range(SliceStart - tick_spacing, SliceEnd, tick_spacing)

需要注意的是必須減去tick_spacing章蚣,否則標(biāo)注會錯位。

(3) 子圖配置——ax.plot

這里是曲線圖部分姨夹,不做過多描述纤垂,有一點需要注意的就是矾策,因為兩個子圖共用一個橫坐標(biāo),所以第一行的圖(也就是plot)的橫坐標(biāo)標(biāo)注可以隱藏不顯示峭沦,通過如下代碼實現(xiàn):

plt.tick_params(
        axis='x',  # changes apply to the x-axis
        which='both',  # both major and minor ticks are affected
        bottom=False,  # ticks along the bottom edge are off
        top=False,  # ticks along the top edge are off
        labelbottom=False)  # labels along the bottom edge are off

(4) 其他

為了確保兩個圖的橫坐標(biāo)對齊贾虽,每個子圖配置結(jié)束后添加一行。

plt.xlim([0, LenData])

(5) 代碼

from matplotlib import gridspec
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import pandas as pd
import numpy
from pandas import Series

def drawHeat_plot(line, data, xSize, ySize, xtick, tick_spacing, cols='sin',
                filename='HeatPlot', title='Demo',
                yticklabel=['Value']):  
    textFS = 80
    titleFS = 100
    LenData = len(line)
    rc = {'font.size': textFS, 'xtick.labelsize': textFS, 'ytick.labelsize': textFS, }
    sns.set(rc=rc)
    size = np.shape(data)
    fig = plt.figure(figsize=(xSize, ySize))
    gs = gridspec.GridSpec(2, 1, height_ratios=[2, 1])
    ax1 = plt.subplot(gs[1])

    heatplt = sns.heatmap(data, linewidths=0, ax=ax1, cmap="YlGnBu", annot=False,
                           xticklabels=xtick,
                          cbar=False, yticklabels=yticklabel)

    plt.xticks(fontsize=textFS)
    plt.yticks(fontsize=textFS)
    ax1.set_ylabel('Value', fontsize=textFS)
    ax1.set_xlabel('Time step', fontsize=textFS)
    plt.xlim([0, LenData])
    ax1.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
    
    
    ax0 = plt.subplot(gs[0])
    ax0.plot(line, linewidth=3)
    ax0.set_ylabel('Value', fontsize=textFS)
    plt.tick_params(
        axis='x',  # changes apply to the x-axis
        which='both',  # both major and minor ticks are affected
        bottom=False,  # ticks along the bottom edge are off
        top=False,  # ticks along the top edge are off
        labelbottom=False)  # labels along the bottom edge are off
    ax0.set_title(title, fontsize=titleFS)
    ax0.grid(linestyle='--', linewidth='0.5', color='black')
    plt.legend([cols + ' Data'], fontsize=textFS)
    plt.xlim([0, LenData])

    fig = heatplt.get_figure()
    fig.savefig(filename + ".png", format='png', bbox_inches='tight', transparent=True)

Demo數(shù)據(jù)及參數(shù):

line = np.sin([3.14*i/20 for i in range(0,100)])
data = np.sin([3.14*i/20 for i in range(0,100)])
line = np.reshape(line,[100,])
data = np.reshape(data,[1,100])
xSize = 150
ySize = 30
SliceStart = 0
SliceEnd = 100
TickSpace = 10

運行代碼:

drawHeat_plot(line, data, xSize, ySize, range(SliceStart - TickSpace, SliceEnd, TickSpace), tick_spacing=TickSpace, cols='sin',
                filename='HeatPlot', title='Demo')

運行結(jié)果:


Demo

總結(jié):

數(shù)據(jù)可視化是一門學(xué)問吼鱼,如何在一張有限的圖上清楚有效地展示圖片想要說明的信息蓬豁。一方面,根據(jù)想要突出數(shù)據(jù)的哪方面的信息菇肃,選擇合適類型的圖型地粪;另一方面,給讀圖的人一種清楚明了的感覺琐谤,需要對可視化圖的細節(jié)——例如排布驶忌、字體、字體大小笑跛、圖例付魔、顏色等等各個方面進行調(diào)節(jié)。這樣飞蹂,做出figure才既能表達作圖者想要表達的信息几苍,也能讓讀圖者清楚清爽地領(lǐng)會數(shù)據(jù)呈現(xiàn)出來的信息。
之后筆者接觸到其他類型的可視化以及相關(guān)注意事項時會繼續(xù)在這篇文章中書寫陈哑。如有意見和建議請各位提出~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妻坝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惊窖,更是在濱河造成了極大的恐慌刽宪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件界酒,死亡現(xiàn)場離奇詭異圣拄,居然都是意外死亡,警方通過查閱死者的電腦和手機毁欣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門庇谆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凭疮,你說我怎么就攤上這事饭耳。” “怎么了执解?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵寞肖,是天一觀的道長。 經(jīng)常有香客問我,道長新蟆,這世上最難降的妖魔是什么耕姊? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮栅葡,結(jié)果婚禮上茉兰,老公的妹妹穿的比我還像新娘。我一直安慰自己欣簇,他們只是感情好规脸,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著熊咽,像睡著了一般莫鸭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上横殴,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天被因,我揣著相機與錄音,去河邊找鬼衫仑。 笑死梨与,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的文狱。 我是一名探鬼主播粥鞋,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瞄崇!你這毒婦竟也來了呻粹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤苏研,失蹤者是張志新(化名)和其女友劉穎等浊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摹蘑,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡筹燕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纹蝴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庄萎。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡踪少,死狀恐怖塘安,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情援奢,我是刑警寧澤兼犯,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響切黔,放射性物質(zhì)發(fā)生泄漏砸脊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一纬霞、第九天 我趴在偏房一處隱蔽的房頂上張望凌埂。 院中可真熱鬧,春花似錦诗芜、人聲如沸瞳抓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孩哑。三九已至,卻和暖如春翠桦,著一層夾襖步出監(jiān)牢的瞬間横蜒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工销凑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丛晌,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓斗幼,卻偏偏與公主長得像茵乱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子孟岛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容