原文:
www.kdnuggets.com/2019/03/r-vs-python-data-visualization.html
R 和 Python 使我们能够生成复杂且吸引人的统计图形,以便获得见解和探索数据。两者都能处理数百万的数据点(可能取决于平台,甚至数十亿)。
1. Google 网络安全证书 - 快速进入网络安全职业道路。
2. Google 数据分析专业证书 - 提升你的数据分析技能
3. Google IT 支持专业证书 - 支持你的组织 IT
Seaborn 建立在 Matplotlib 之上,语法和结构相对简单。
首先,我们使用 import seaborn as sns; sns.set()
加载并设置 seaborn 主题默认值到 Python 会话中。由于两个库是一起使用的,Matplotlib 也必须加载。
import seaborn as sns; sns.set()
import matplotlib.pyplot as plt
-
sns.set_style()
设置图表的背景主题。"ticks" 是最接近 R 中制作的图表的样式。 -
sns.set_context()
将应用预定义的格式以适应可视化的用途或背景。font_scale=1
用于设置图表中所有文本的字体大小比例。 -
plt.figure()
是一个命令,用于控制 matpltlib 图形的不同方面(如前所述,seaborn 图形实际上是 Matplotlib 图形)。 -
sns.scatterplot()
是用于传递参数以创建 seaborn 风格散点图的命令。
-
x="wt"
将重量映射到 x 轴。 -
y="hp"
将马力映射到 y 轴。 -
hue="cyl"
将填充和着色散点。 -
palette=['red','green','blue']
手动覆盖hue
设置的颜色调色板,将其改为红色、绿色和蓝色。 -
data="mtcars"
允许我们使用数据集中的数据。 -
style='cyl'
为每个气缸类别分配形状。 -
legend='brief'
将分配hue
和size
。
sizes=(800,1000)
控制图表上散点的最小和最大大小。
-
plt.title()
为图表设置主标题。如果你是经验丰富的 Matplotlib 用户,或者之前使用过 plt.suptitle(),你会知道同时使用这两个函数时的困惑。 参数很明显。 -
plt.xlabel()
将格式化 x 轴标签。我使用set_..
访问类来包含美学属性。这有时可能会显得杂乱,但有许多方法可以格式化 seaborn/matplotlib 图形。这在图形创建后非常有用。图形已经用sns.scatterplot
创建,因此我们需要以这种方式覆盖默认格式。 -
plt.ylabel()
的工作方式与 x 轴完全相同,只是针对 y 轴。
#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");
正如我们所见,该图形与 ggplot2 创建的图形非常相似。对于对这个图进行分面处理,Seaborn 是 Matplotlib 的一个更简单的替代方案。
在 Seaborn 中进行分面处理需要创建一个新图形。有多种方法可以实现,sns.relplot()
就是其中之一。
-
sns.set()
将默认的 Seaborn 主题设置到 Python 环境中,也可以用于覆盖默认参数,如rc={'figure.figsize':(20,20)}
。 -
sns.relplot()
具有许多与上述讨论相同的参数,这里我们将讨论针对分面处理的新参数。
-
col="gear"
指定了在 mtcars 数据集中用于分面化的列。 -
col_wrap=3
指定了图形的排列方式。在这种情况下,图形将被放置在 3 列中。由于没有指定行数,所以它将位于一行中,但如果需要,可以指定行数。 -
aspect=0.6
是控制图形大小的参数。我建议阅读相关文档,因为这个部分的解释可能会变得复杂。
g.fig.suptitle()
为图形创建标题。
position=(0.5,1.05)
是一个有趣的参数,因为它控制标题的位置。即使是小的变化也能显著改变标题的位置。
g.set_xlabels
和g.set_ylabels
将按之前讨论的方式工作。
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,我们可以通过向图形添加美学层来创建简单且可自定义的图形。对新用户来说,一个很棒的功能是,除了加载数据和指定几何形状外,美学层(大部分情况下)可以按照任何顺序添加。这是因为 ggplot2 建立在图形语法的原则之上。这些原则使我们能够创建引人注目且信息丰富的可视化。
以下 R 代码将加载 ggplot2 包(可能是 R 中最突出的可视化包),并为我们生成一个散点图。
-
ggplot(mtcars, aes(x=wt, y=hp))
将加载 mtcars 数据集以供 ggplot2 使用,aes(x=wt, y=hp)
将为我们的图形映射美学,其中 x 美学表示 x 轴的重量,y 美学表示 y 轴的马力。 -
geom_point(size=1,aes(color=cyl, shape=cyl, fill=cyl))
将生成具有之前定义的美学属性和新的美学属性的散点图。color=cyl
将根据气缸数为散点的轮廓赋予独特的颜色。shape=cyl
将为散点赋予独特的形状,并与color
一起工作。fill=cyl
将填充散点的颜色,而不仅仅是轮廓。最好将color
和fill
一起使用(如果你仔细查看,会发现有一个细微的美学差异)。 -
theme_bw()
提供了 ggplot2 中的一个预制主题,我们可以用来开始。然后可以使用正确的命令轻松调整。ggplot2 的语法简单易学,这使得调整变得容易。 -
theme()
是允许你更改在第 3 点中设置的任何主题的默认设置的命令(你也可以用它来更改图表的其他美学属性)。-
axis.text=element_text(face='bold', size=7
格式化了 y 轴和 x 轴的文本(轴上的数字)。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))
仅仅是加粗并更改主标题的大小。***hjust=0.5***
将 使标题居中对齐。 -
scale_color_manual(breaks = c("4", "6", "8"), values=c("red", "green", "blue"))
将覆盖默认的颜色方案,并将红色添加到 '4',绿色添加到 '6',蓝色添加到 '8'。这会手动覆盖散点的轮廓颜色。 -
scale_fill_manual(breaks = c("4", "6", "8"), values=c("red", "green", "blue"))
将对散点的内部进行与上述相同的操作。 -
scale_y_continuous(breaks = seq(0,350,50))
手动覆盖 y 轴上的数字,使其从零开始,到 350 结束,单位增量为 50。这将显示在主要刻度上。 -
scale_x_continuous(breaks = seq(1.5,5.5,0.5), minor_breaks=seq(1.5,5.5,1))
对 x 轴做了与上述相同的操作,并手动覆盖了次要刻度,但这不会那么明显。 -
scale_shape_manual(values=c(21,4,22))
将定义每个气缸类别的形状类型。
-
-
options(repr.plot.width=4, repr.plot.height=3)
是一个方便的命令,当你想要调整图形的宽度和高度时特别有用。它在 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
ggplot: mtcars 散点图
ggplot2 的另一个优点是其 能够在一行代码中对数据进行分面,创建多个图表。
facet_grid(~gear)
将按齿轮数量细分数据,并创建多个具有相同主题美学的相同图形。
options(repr.plot.width=7, repr.plot.height=4)
p + facet_grid(~gear)
ggplot: mtcars 分面散点图
我认为主要的区别之一是,Seaborn 绘图的默认分辨率优于 ggplot2 图形,所需的语法也可能少得多(但这取决于具体情况)。Seaborn 使用编程方法,用户可以访问 Seaborn 和 Matplotlib 中的类来操作图形。ggplot2 使用分层方法,用户可以以任意顺序添加美学和格式来创建图形(尽管所需的代码量更多,我认为这种方法可能更简单)。大多数人不会注意到这一点,而这对某些人可能比其他人更为重要,Python 图形在保存为图像时占用的磁盘空间显著大于 R 生成的图形。在本文中的图形中,Seaborn/Matplotlib 图形占用的磁盘空间约为 ggplot2 图形的 6 倍。
尽管有些细微的差别,但使用 Seaborn 和 ggplot2 重新创建相同的图形是非常可能的。虽然工具不同,但仍然可以用它们创建相同的对象。
相关:
-
Python 图形画廊
-
五大最佳数据可视化库
-
数据可视化备忘单