R和Python使我們擁有生成復(fù)雜而有吸引力的統(tǒng)計(jì)圖形的能力,以便獲得洞察力和探索我們的數(shù)據(jù)。兩者都具備良好的處理數(shù)百萬(wàn)數(shù)據(jù)點(diǎn)的能力(根據(jù)平臺(tái)的不同可能有數(shù)十億)。
Seaborn構(gòu)建在Matplotlib之上,與Matplotlib相比,Seaborn具有相對(duì)簡(jiǎn)單的語(yǔ)法和結(jié)構(gòu)。
首先,我們使用import seaborn as sns; sns.set()
來(lái)加載和設(shè)置默認(rèn)為Python會(huì)話的seaborn主題。Matplotlib也必須加載,因?yàn)檫@兩個(gè)庫(kù)是同時(shí)使用的。
import seaborn as sns
sns.set()
import matplotlib.pyplot as plt
set_style()設(shè)置圖形的背景主題?!皌icks”是最接近R的畫(huà)圖。
set_context()將對(duì)圖形應(yīng)用預(yù)定義的格式,以適應(yīng)使用可視化的原因或上下文。font_scale=1用于設(shè)置圖中所有文本的字體大小。
plt.figure()是一個(gè)控制matpltlib圖的不同方面的命令(如前所述,seaborn圖只是隱藏在幕后的Matplotlib圖)。
sns.scatterplot()是用于傳遞參數(shù)以創(chuàng)建seaborn樣式的scatterplot的命令。
x='wt'將權(quán)重映射到x軸。
y='hp'將horsepower映射到y(tǒng)軸。
hue='cyl'將填充和著色散點(diǎn)。
palette =['red','green','blue']手動(dòng)覆蓋由hue 設(shè)定的red, green和blue調(diào)色板。
data='mtcars'允許我們使用數(shù)據(jù)集中的數(shù)據(jù)。
style='cyl'為每個(gè)cyinder類別分配形狀。
legend ='brief'將指定hue&size。
size =(800,1000)控制圖上散點(diǎn)的最小和最大尺寸。
plt.title()給出了圖片的主標(biāo)題。如果您是一個(gè)經(jīng)驗(yàn)豐富的Matplotlib用戶或使用過(guò)plt.suptitle(),那么在您知道將這兩者一起使用時(shí)的混淆之前。
plt.xlabel()將格式化x軸標(biāo)簽。我使用set_ . .要訪問(wèn)該類以包含美學(xué)屬性。這有時(shí)會(huì)很混亂,但是有很多方法可以格式化seaborn/matplotlib圖。這對(duì)于創(chuàng)建好圖之后非常有用。圖形已經(jīng)用sns制作好了。scatterplot現(xiàn)在需要以這種方式覆蓋默認(rèn)格式。
對(duì)于y軸,pl .ylabel()以完全相同的方式工作。
#sns.set_style('darkgrid')
sns.set_style('ticks')
sns.set_context('talk')
#sns.set_context('notebook', font_scale=1)
plt.figure(figsize=(10,8)) #plt.figure(figsize=(width,height))
sns.scatterplot(x='wt', y='hp', hue='cyl', palette=['red','green','blue'],
data=mtcars, style='cyl', legend='brief', sizes=(800,1000)
)
plt.title('Motor Trend Car Road Tests of 1973-74 Models', fontsize=24, fontweight='bold')
plt.xlabel('Weigt (1000lbs)').set_fontsize('22')
plt.xlabel('Weigt (1000lbs)').set_fontweight('bold')
plt.ylabel('Gross Horsepower').set_fontsize('22')
plt.ylabel('Gross Horsepower').set_fontweight('bold');
正如我們所看到的,這個(gè)圖與ggplot2中生成的圖類似。Seaborn是Matplotlib的一個(gè)更簡(jiǎn)單的替代方案。
對(duì)于Seaborn需要?jiǎng)?chuàng)建一個(gè)新的圖片。有很多方法可以做到這一點(diǎn),而sns.relplot()就是其中之一。
sns.set()將把默認(rèn)的Seaborn主題設(shè)置到Python環(huán)境中,它還可以用來(lái)覆蓋默認(rèn)參數(shù),正如我們看到的rc={'figure.figsize':(20,20)}。
sns.relplot()有許多與上面討論的相同的參數(shù),在這里我們將討論新的參數(shù),因?yàn)檫@個(gè)圖是分面的。
col='gear'指定mtcars數(shù)據(jù)集中用于面化的列。
col_wrap=3指定了圖的位置。在本例中,圖將被放置在3列中。它將在一行中,因?yàn)闆](méi)有指定行數(shù)。
aspect=0.6是對(duì)繪圖大小的控制。我建議閱讀關(guān)于這方面的文檔,因?yàn)樵谶@一點(diǎn)上解釋起來(lái)可能會(huì)很混亂。
g.fig.suptitle()為圖形創(chuàng)建標(biāo)題。
position=(0.5,1.05)是一個(gè)有趣的參數(shù),因?yàn)樗刂茦?biāo)題的位置。即使是很小的改變也能極大地改變標(biāo)題的位置。
g。set_xlabels & g。set_ytags將像前面討論的那樣工作。
sns.set(rc={'figure.figsize':(20,20)})
sns.set_style('ticks')
sns.set_context('talk')
g = sns.relplot(x='wt', y='hp', hue='cyl', palette=['red','green','blue'],
data=mtcars, col='gear', col_wrap=3,
height=6, aspect=0.6, style='cyl', sizes=(800,1000))
g.fig.suptitle('Motor Trend Car Road Tests of 1973-74 Models' ,position=(0.5,1.05), fontweight='bold', size=18)
g.set_xlabels('Weigt (1000lbs)',fontweight='bold', size=20)
g.set_ylabels('Gross Horsepower',fontweight='bold', size=20);
使用ggplot2,我們可以通過(guò)向圖片添加美學(xué)層來(lái)創(chuàng)建簡(jiǎn)單且可定制的圖形。對(duì)于新用戶來(lái)說(shuō),一個(gè)很好的特性是除了加載ggplot2中使用的數(shù)據(jù)并給出幾何形狀之外,還可以(大多數(shù)情況下)以任何順序完成美學(xué)層。這是因?yàn)間gplot2是基于圖形語(yǔ)法的原則構(gòu)建的。這些原則使我們能夠創(chuàng)建驚奇的和富含信息的可視化。
下面的R代碼將加載ggplot2包(可能是R中最突出的可視化包),并為我們生成散點(diǎn)圖。
ggplot(mtcars, aes(x=wt, y=hp))將加載ggplot2中使用的mtcars數(shù)據(jù)集,aes(x=wt, y=hp)將映射我們的圖的美學(xué),x美學(xué)為wt為x軸,y美學(xué)為hp為y軸。
geom_point(size=1,aes(color=cyl, shape=cyl, fill=cyl))將生成前面提到的預(yù)定義美學(xué)和新的美學(xué)的散點(diǎn)圖。color=cyl將根據(jù)cyl的數(shù)量為散射點(diǎn)的輪廓提供一種獨(dú)特的顏色。shape=cyl將為散點(diǎn)提供一個(gè)獨(dú)特的形狀,并與顏色協(xié)同工作。fill=cyl將使用cyl填充散點(diǎn),而不僅僅是輪廓線。最好是使用顏色和填充在一起(如果你仔細(xì)觀察,會(huì)發(fā)現(xiàn)有一個(gè)很小的審美差異)。
heme_bw()在ggplot2中為我們提供了一個(gè)預(yù)先生成的主題。然后可以使用正確的命令輕松地調(diào)整它。ggplot2具有用于此任務(wù)的簡(jiǎn)單且易于學(xué)習(xí)的語(yǔ)法,而且易于操作。
theme()命令允許您更改第3點(diǎn)中已經(jīng)設(shè)置的任何主題的默認(rèn)設(shè)置(還可以使用它更改圖形的其他美學(xué))。
axis.text=element_text(face='bold', size=7格式化y軸和x軸的文本(軸上的數(shù)字)。face='bold'將文本加粗,size='7'將其大小增加到指定的大小。
axis.title=element_text(face='bold', size=10)的工作原理與上面的命令相同,但只適用于axis標(biāo)題。
axis.ticks=element_line(size=0.5)將使圖上的刻度更明顯
panel.background=element_rect(color = NA)是我決定添加的一個(gè)美學(xué)度量,它去掉了圖形周圍的矩形邊框
plot.title=element_text(face='粗體',size=11,hjust = 0.5))只需粗體顯示并更改主標(biāo)題的大小。hjust=0.5將標(biāo)題居中對(duì)齊
scale_color_manual(break =c(' 4', '6', '8'), values=c('red', 'green', 'blue'))將覆蓋默認(rèn)的配色方案,并將紅色添加到'4',綠色添加到'6',藍(lán)色添加到'8'。這將手動(dòng)覆蓋散點(diǎn)的輪廓顏色
scale_fill_manual(break =c(' 4', '6', '8'), values=c('red', 'green', 'blue'))將執(zhí)行與上面相同的操作,但這次是針對(duì)散點(diǎn)的內(nèi)部。
scale_y_continuous(break = seq(0,350,50))手動(dòng)覆蓋y軸上的數(shù)字,從0開(kāi)始,350結(jié)束,以50為增量。這將顯示在主要刻度。
scale_x_continuous(break =seq(1.5、5.5、0.5),minor_break =seq(1.5、5.5、1))對(duì)x軸執(zhí)行與上面相同的操作,并手動(dòng)覆蓋較小的刻度,但是這并不明顯。
scale_shape_manual(值=c(21,4,22))將定義給每個(gè)cylinders類別的形狀類型。
options(repr.plot.width=4, repr.plot.height=3)當(dāng)您想要操縱圖形的寬度和高度時(shí),這是一個(gè)方便的命令。它在Jupyter特別有用。
library(ggplot2)
options(repr.plot.width=4, repr.plot.height=3)
p <- ggplot(mtcars, aes(x=wt, y=hp))
geom_point(size=1,aes(color=cyl, shape=cyl, fill=cyl))
labs(title='Motor Trend Car Road Tests of 1973-74 Models')
xlab('Weigt (1000lbs)')
ylab('Gross Horsepower')
theme_bw()
theme(axis.text=element_text(face='bold',
size=7),
axis.title=element_text(face='bold',
size=10),
axis.ticks=element_line(size=0.5),
panel.background=element_rect(colour = NA),
plot.title=element_text(face='bold', size=11,hjust = 0.5))
scale_color_manual(breaks = c('4', '6', '8'), values=c('red', 'green', 'blue'))
scale_fill_manual(breaks = c('4', '6', '8'), values=c('red', 'green', 'blue'))
scale_y_continuous(breaks = seq(0,350,50))
scale_x_continuous(breaks = seq(1.5,5.5,0.5), minor_breaks=seq(1.5,5.5,1))
scale_shape_manual(values=c(21,4,22))
p
ggplot2的另一個(gè)重要方面是它能夠?qū)?shù)據(jù)進(jìn)行分面處理,從而在一行代碼中創(chuàng)建多個(gè)圖。
facet_grid(~gear) 將數(shù)據(jù)以gears的數(shù)量劃分,創(chuàng)建許多具有相同主題美學(xué)的相同情節(jié)。
options(repr.plot.width=7, repr.plot.height=4)
p facet_grid(~gear)
我認(rèn)為主要的區(qū)別之一是,與ggplot2圖形相比,Seaborn圖具有更好的分辨率,并且所需的語(yǔ)法可以少得多(但這取決于環(huán)境)。Seaborn使用編程方法,用戶可以訪問(wèn)Seaborn和Matplotlib中的類來(lái)操縱這些圖。ggplot2使用分層的方法,用戶可以按照創(chuàng)建圖形的任何順序添加美學(xué)和格式(我相信,盡管需要大量代碼,但可以更簡(jiǎn)單)。大多數(shù)人都沒(méi)有注意到,這一點(diǎn)對(duì)某些人可能比其他人更重要,當(dāng)以圖形形式保存Python繪圖時(shí),它會(huì)比R生成的圖形占用更多的磁盤空間。在本文的圖形中,Seaborn/Matplotlib圖形比ggplot2圖形占用大約6倍的磁盤空間。
使用Seaborn和ggplot2非常有可能重新創(chuàng)建相同的圖形(盡管略有不同)。雖然工具不同,但它們?nèi)匀豢梢杂脕?lái)創(chuàng)建相同的對(duì)象。
作者:Asel Mendis
原文鏈接:
https://www.kdnuggets.com/2019/03/r-vs-python-data-visualization.html
聯(lián)系客服