数据可视化:Matplotlib vs ggplot2
时间:2022-08-25 00:30:00
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
2020年即将结束(最后),数据可视化再重要不过了。呈现一个看起来像5岁孩子的东西不再是一种选择,所以数据科学家需要一个有吸引力、简单易用的数据可视化库。
今天我们将比较其中两个-Matplotlib和ggplot2。
为什么是这两个?Matplotlib这是我学到的第一个可视化库。但最近,我越来越喜欢R语言ggplot但今天我们将在这两个库中重新创建五张相同的图片,看看代码和美学的进展。
数据呢?我们将使用两个著名的数据集:mtcars以及航空乘客。你可以通过导出CSV功能通过RStudio在这里可以获得第一个,第二个:https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv
以下是R和Python的库导入:
R: library(ggplot2) Python: importpandasaspd importmatplotlib.pyplotasplt importmatplotlib.datesasmdates mtcars=pd.read_csv('mtcars.csv')
直方图
我们使用直方图可视化给定变量的分布。这正是我们对的mtcars数据集-可视化MPG属性分布。
以下是R的代码和结果:
ggplot(mtcars,aes(x=mpg)) geom_histogram(bins=15,fill='#087E8B',color='#02454d') ggtitle('HistogramofMPG') xlab('MPG') ylab('Count')
Python也是这样:
plt.figure(figsize=(12,7)) plt.hist(mtcars['mpg'],bins=15,color='#087E8B',ec='#02454d') plt.title('HistogramofMPG') plt.xlabel('MPG') plt.ylabel('Count');
默认情况下,两者非常相似。即使我们需要编写相同的代码,也很难在这里选择我们最喜欢的代码。Pythonx轴从0开始,但在R中很容易改变。另一方面,我喜欢R中没有边界,但这也是Python容易实现的东西。
平局
条形图
条形图由不同高度的矩形组成,其中高度表示给定属性段的值。我们将使用它们来比较不同数量的圆柱体(属性)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('BarchartofCYL') xlab('Numberofcylinders') 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('BarchartofCYL') plt.xlabel('Numberofcylinders') 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('ScatterplotofHPvsMPG') xlab('Horsepower') ylab('Milespergallon')
Python也是一样:
colors=[] forvalinmtcars['cyl']: ifval==4:colors.append('#17314c') elifval==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('ScatterplotofHPvsMPG') plt.xlabel('Horsepower') plt.ylabel('Milespergallon');
在代码方面,这是R和ggplot2.明显胜利。Matplotlib通过第三个属性对数据点进行着色,不提供简单的方法,因此必须手动执行此步骤。尺寸也有点奇怪。
获胜者:ggplot2
箱线图
箱线图用于通过四分位数可视化数据。它们通常从盒子里伸出有线(胡须),在上下四分位数之外显示变化。中线为中值。顶部或底部显示的点被视为异常值。
通过不同的方式,我们将使用箱线图CYL值来可视化MPG。
以下是R的代码和结果:
ggplot(mtcars,aes(x=as.factor(cyl),y=mpg)) geom_boxplot(fill='#087E8B',alpha=0.6) ggtitle('Boxplotnbsp;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
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~