Matplotlib vs ggplot2

做者|Dario Radečić
編譯|VK
來源|Towards Datas Sciencepython

2020年即將結束(終於),數據可視化再重要不過了。呈現一個看起來像5歲小孩的東西已經再也不是一個選擇,因此數據科學家須要一個有吸引力和簡單易用的數據可視化庫。git

今天咱們將比較其中的兩個-Matplotlib和ggplot2。github

爲何是這兩個?Matplotlib是我學習的第一個可視化庫。但最近我愈來愈喜歡R語言的ggplot2了,可是今天咱們將在這兩個庫中從新建立五個相同的圖,看看代碼和美學方面的進展。app

數據呢?咱們將使用兩個著名的數據集:mtcars和航空乘客。你能夠經過導出CSV功能經過RStudio得到第一個,第二個在這裏可用:https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv機器學習

如下是R和Python的庫導入:學習

R: 
library(ggplot2) 

Python: 
import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 
mtcars = pd.read_csv('mtcars.csv')

直方圖

咱們使用直方圖來可視化給定變量的分佈。這正是咱們對mtcars數據集所作的——可視化MPG屬性的分佈。.net

如下是R的代碼和結果:3d

ggplot(mtcars, aes(x=mpg)) + 
  geom_histogram(bins=15, fill='#087E8B', color='#02454d') +
  ggtitle('Histogram of MPG') + xlab('MPG') + ylab('Count')

Python也是這樣:code

plt.figure(figsize=(12, 7)) 
plt.hist(mtcars['mpg'], bins=15, color='#087E8B', ec='#02454d')
plt.title('Histogram of MPG') 
plt.xlabel('MPG') 
plt.ylabel('Count');

默認狀況下二者很是類似。即便咱們須要編寫的代碼量也大體相同,因此很難在這裏選擇最喜歡的代碼。我喜歡Python的x軸是從0開始的,但在R中能夠很容易地改變。另外一方面,我喜歡R中沒有邊界,但這也是Python中易於實現的東西。orm

平局

條形圖

條形圖由不一樣高度的矩形組成,其中高度表示給定屬性段的值。咱們將使用它們來比較不一樣數量的圓柱體(屬性cyl)的計數。

如下是R的代碼和結果:

ggplot(mtcars, aes(x=cyl)) + 
  geom_bar(fill='#087E8B', color='#02454d') + 
  scale_x_continuous(breaks=seq(min(mtcars$cyl), max(mtcars$cyl), by=2)) + 
  ggtitle('Bar chart of CYL') + 
  xlab('Number of cylinders') + ylab('Count')

Python也是同樣:

bar_x = mtcars['cyl'].value_counts().index 
bar_height = mtcars['cyl'].value_counts().values 

plt.figure(figsize=(12, 7)) 
plt.bar(x=bar_x, height=bar_height, color='#087E8B', ec='#02454d') 
plt.xticks([4, 6, 8]) 
plt.title('Bar chart of CYL') 
plt.xlabel('Number of cylinders') 
plt.ylabel('Count');

毫無疑問,R的代碼更整潔、更簡單,由於Python須要手動計算高度。從美學角度看,它們很是類似,但代碼我更喜歡R版。

獲勝者:ggplot2

散點圖

散點圖用於可視化兩個變量之間的關係。這樣作的目的是觀察第二個變量隨着第一個變量的變化(上升或降低)會發生什麼。咱們還能夠經過對其餘屬性值的點着色來爲二維圖添加另外一個「維度」。

咱們將使用散點圖來可視化HP和MPG屬性之間的關係。

如下是R的代碼和結果:

ggplot(mtcars, aes(x=hp, y=mpg)) + 
  geom_point(aes(size=cyl, color=cyl)) + 
  ggtitle('Scatter plot of HP vs MPG') + 
  xlab('Horse power') + ylab('Miles per gallon')

Python也是同樣:

colors = [] 
for val in mtcars['cyl']: 
    if val == 4: colors.append('#17314c') 
    elif val == 6: colors.append('#326b99') 
    else: colors.append('#54aef3') 
plt.figure(figsize=(12, 7)) 
plt.scatter(x=mtcars['hp'], y=mtcars['mpg'], s=mtcars['cyl'] * 20, c=colors) 
plt.title('Scatter plot of HP vs MPG') 
plt.xlabel('Horse power') 
plt.ylabel('Miles per gallon');

代碼方面,這是R和ggplot2的明顯勝利。Matplotlib不提供一種簡單的方法,經過第三個屬性給數據點上色,所以咱們必須手動執行該步驟。尺寸也有點怪。

獲勝者:ggplot2

箱線圖

箱線圖用於經過四分位數可視化數據。它們一般會有線(鬍鬚)從盒子裏伸出來,這些線在上下四分位數以外顯示出變化。中間的線是中值。頂部或底部顯示的點被視爲異常值。

咱們將使用箱線圖,經過不一樣的CYL值來可視化MPG。

如下是R的代碼和結果:

ggplot(mtcars, aes(x=as.factor(cyl), y=mpg)) + 
  geom_boxplot(fill='#087E8B', alpha=0.6) + 
  ggtitle('Boxplot of CYL vs MPG') + 
  xlab('Number of cylinders') + ylab('Miles per gallon')

Python也是同樣:

boxplot_data = [ 
    mtcars[mtcars['cyl'] == 4]['mpg'].tolist(), 
    mtcars[mtcars['cyl'] == 6]['mpg'].tolist(), 
    mtcars[mtcars['cyl'] == 8]['mpg'].tolist() 
] 

fig = plt.figure(1, figsize=(12, 7)) 
ax = fig.add_subplot(111) 
bp = ax.boxplot(boxplot_data, patch_artist=True) 

for box in bp['boxes']: 
    box.set(facecolor='#087E8B', alpha=0.6, linewidth=2) 

for whisker in bp['whiskers']: 
    whisker.set(linewidth=2) 

for median in bp['medians']: 
    median.set(color='black', linewidth=3) 

ax.set_title('Boxplot of CYL vs MPG') 
ax.set_xlabel('Number of cylinders') 
ax.set_ylabel('Miles per galon') 
ax.set_xticklabels([4, 6, 8]);

有一件事是當即可見的-Matplotlib須要大量的代碼來生成一個外觀不錯的boxplot。ggplot2不是這樣。到目前爲止,R是這裏明顯的贏家。

獲勝者:ggplot2

折線圖

如今咱們將從mtcars數據集轉移到airline passengers數據集。咱們將使用它建立一個帶有日期格式的x軸的簡單折線圖。這並不像聽起來那麼容易。

如下是R的代碼和結果:

ap <- read.csv('https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv') 
ap$Month <- as.Date(paste(ap$Month, '-01', sep='')) 

ggplot(ap, aes(x=Month, y=Passengers)) + 
  geom_line(size=1.5, color='#087E8B') + 
  scale_x_date(date_breaks='1 year', date_labels='%Y') + 
  ggtitle('Line chart of Airline passengers') + 
  xlab('Year') + ylab('Count')

Python也是同樣:

ap = pd.read_csv('https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv') 
ap['Month'] = ap['Month'].apply(lambda x: pd.to_datetime(f'{x}-01')) 

fig = plt.figure(1, figsize=(12, 7)) 
ax = fig.add_subplot(111) 
line = ax.plot(ap['Month'], ap['Passengers'], lw=2.5, color='#087E8B') 

formatter = mdates.DateFormatter('%Y')
ax.xaxis.set_major_formatter(formatter) 
locator = mdates.YearLocator() 
ax.xaxis.set_major_locator(locator) 
ax.set_title('Line chart of Airline passengers') ax.set_xlabel('Year') ax.set_ylabel('Count');

從美學角度來看,這些圖表幾乎徹底相同,但在代碼量方面,ggplot2再次擊敗Matplotlib。與Python相比,R在X軸顯示日期要容易得多。

獲勝者:ggplot2

結論

在我看來,ggplot2在簡單性和數據可視化美觀方面是一個明顯的贏家。幾乎老是能夠歸結爲很是類似的3-5行代碼,而Python則不是這樣。

原文連接:https://towardsdatascience.com/matplotlib-vs-ggplot2-which-to-choose-for-2020-and-beyond-ced5e294bfdc

歡迎關注磐創AI博客站:
http://panchuang.net/

sklearn機器學習中文官方文檔:
http://sklearn123.com/

歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/

相關文章
相關標籤/搜索