在Python中使用 Plotnine 和 ggplot2 进行数据可视化
数据可视化是一种以图形、图表或绘图的形式呈现数据的技术。可视化数据使数据分析师更容易分析数据中可能存在的趋势或模式,因为它以简单易懂的格式总结了大量数据。
在本文中,我们将讨论如何在Python中使用 plotnine 可视化数据,这是图形语法的严格实现。在开始之前,让我们先了解一下什么是图形语法。
什么是图形语法?
图形语法基本上是一种工具,使我们能够描述给定图形的组件。基本上,这使我们能够看到命名图形之外的内容(散点图,仅举一个例子),并且基本上可以看到它背后的基本统计数据。将图形语法视为英语语法,我们使用不同的单词、时态、标点符号来组成句子。
图形语法的组成部分
通常,要构建或描述具有一个或多个维度的任何可视化,我们可以使用下图中显示的组件。
首先,我们将看到创建绘图所需的三个主要组件,如果没有这些组件,plotnine 将无法绘制图形。这些都是-
- 数据是用于绘制绘图的数据集。
- 美学 (aes)是数据变量与绘图使用的变量之间的映射,例如 x 轴、y 轴、颜色、填充、大小、标签、alpha、形状、线宽、线型。
- 几何对象(geoms)是我们想要使用的绘图类型或几何对象,例如点、线、直方图、条形图、箱线图等。
有各种可选组件可以使情节更有意义和更美观。这些都是 -
- 分面允许将数据分成组,并且每个组都单独绘制。
- 统计转换在绘制数据之前计算数据。
- 坐标定义对象在 2D 平面中的位置。
- 主题定义了数据的呈现方式,例如字体、颜色等。
安装
plotnine 基于 R 编程语言中的 ggplot2,用于实现Python中的图形语法。要安装 plotnine,请在终端中输入以下命令。
pip install plotnine
在Python中使用 Plotnine 和 ggplot 绘制数据
在这里,我们将使用三个主要组件,即数据、美学和几何对象来绘制我们的数据。让我们详细介绍每个组件。
数据
数据是需要绘制的数据集。我们可以使用 ggplot 构造函数指定数据并将数据集传递给该构造函数。
示例:为 ggplot 指定数据集
我们将使用 Iris 数据集并使用 Pandas 读取它。
Python3
import pandas as pd
from plotnine import ggplot
# reading dataset
df = pandas.read_csv("Iris.csv")
# passing the data to the ggplot
# constructor
ggplot(df)
Python3
import pandas as pd
from plotnine import ggplot, aes
# reading dataset
df = pd.read_csv("Iris.csv")
ggplot(df) + aes(x="Species", y="SepalLengthCm")
Python3
import pandas as pd
from plotnine import ggplot, aes, geom_col
# reading dataset
df = pd.read_csv("Iris.csv")
ggplot(df) + aes(x="Species", y="SepalLengthCm") + geom_col()
Python3
import pandas as pd
from plotnine import ggplot, aes, geom_histogram
# reading dataset
df = pd.read_csv("Iris.csv")
ggplot(df) + aes(x="SepalLengthCm") + geom_histogram()
Python3
import pandas as pd
from plotnine import ggplot, aes, geom_point
# reading dataset
df = pd.read_csv("Iris.csv")
ggplot(df) + aes(x="Species", y="SepalLengthCm") + geom_point()
Python3
import pandas as pd
from plotnine import ggplot, aes, geom_boxplot
# reading dataset
df = pd.read_csv("Iris.csv")
# passing the data to the ggplot
# constructor
ggplot(df) + aes(x="Species", y="SepalLengthCm") + geom_boxplot()
Python3
import pandas as pd
from plotnine import ggplot, aes, geom_line
# reading dataset
df = pd.read_csv("Iris.csv")
ggplot(df) + aes(x="Species", y="SepalLengthCm") + geom_line()
Python3
import pandas as pd
from plotnine import ggplot, aes, facet_grid, labs, geom_col
# reading dataset
df = pd.read_csv("tips.csv")
(
ggplot(df)
+ facet_grid(facets="~sex")
+ aes(x="day", y="total_bill")
+ labs(
x="day",
y="total_bill",
)
+ geom_col()
)
Python3
import pandas as pd
from plotnine import ggplot, aes, geom_histogram
# reading dataset
df = pd.read_csv("Iris.csv")
ggplot(df) + aes(x="SepalLengthCm") + geom_histogram(bins=15)
Python3
import pandas as pd
from plotnine import ggplot, aes, geom_histogram, coord_flip
# reading dataset
df = pd.read_csv("Iris.csv")
(
ggplot(df)
+ aes(x="SepalLengthCm")
+ geom_histogram(bins=15)
+ coord_flip()
)
Python3
import pandas as pd
from plotnine import ggplot, aes, facet_grid, labs, geom_col, theme_xkcd
# reading dataset
df = pd.read_csv("tips.csv")
(
ggplot(df)
+ facet_grid(facets="~sex")
+ aes(x="day", y="total_bill")
+ labs(
x="day",
y="total_bill",
)
+ geom_col()
+ theme_xkcd()
)
Python3
import pandas as pd
from plotnine import ggplot, aes, facet_grid, labs, geom_col, theme_xkcd
# reading dataset
df = pd.read_csv("tips.csv")
(
ggplot(df)
+ facet_grid(facets="~sex")
+ aes(x="day", y="total_bill", fill="time")
+ labs(
x="day",
y="total_bill",
)
+ geom_col()
+ theme_xkcd()
)
Python3
import pandas as pd
from plotnine import ggplot, aes, facet_grid, labs, geom_col, theme_xkcd
# reading dataset
df = pd.read_csv("tips.csv")
plot = (
ggplot(df)
+ facet_grid(facets="~sex")
+ aes(x="day", y="total_bill", fill="time")
+ labs(
x="day",
y="total_bill",
)
+ geom_col()
+ theme_xkcd()
)
plot.save("gfg plotnine tutorial.png")
输出:
这将给我们一个空白输出,因为我们没有指定其他两个主要组件。
美学
现在让我们定义要用于图中每个轴的变量。美学将数据变量映射到图形属性,如 2D 位置和颜色。
示例:在Python中定义 plotnine 和 ggplot 的美学
Python3
import pandas as pd
from plotnine import ggplot, aes
# reading dataset
df = pd.read_csv("Iris.csv")
ggplot(df) + aes(x="Species", y="SepalLengthCm")
输出:
在上面的例子中,我们可以看到物种显示在 x 轴上,萼片长度显示在 y 轴上。但剧情中依旧没有人影。这可以使用几何对象添加。
几何对象
在定义数据和美学之后,我们需要定义我们想要用于可视化的绘图类型。这告诉绘图线应该如何显示数据点。它提供了各种几何对象,如散点图、折线图、条形图、箱线图等。让我们看看它们的各种以及如何使用它们。
注意:有关所有 geom 的列表,请参阅 plotnine 的 geom API 参考。
示例 1:在Python中将几何对象添加到 plotnine 和 ggplot
Python3
import pandas as pd
from plotnine import ggplot, aes, geom_col
# reading dataset
df = pd.read_csv("Iris.csv")
ggplot(df) + aes(x="Species", y="SepalLengthCm") + geom_col()
输出:
在上面的示例中,我们使用了geam_col() 几何图形,它是一个以 x 轴为底的条形图。我们可以将其更改为我们认为适合我们情节的不同类型的几何图形。
示例 2:在Python中使用 plotnine 和 ggplot 绘制直方图
Python3
import pandas as pd
from plotnine import ggplot, aes, geom_histogram
# reading dataset
df = pd.read_csv("Iris.csv")
ggplot(df) + aes(x="SepalLengthCm") + geom_histogram()
输出:
示例 3:在Python中使用 plotnine 和 ggplot 绘制散点图
Python3
import pandas as pd
from plotnine import ggplot, aes, geom_point
# reading dataset
df = pd.read_csv("Iris.csv")
ggplot(df) + aes(x="Species", y="SepalLengthCm") + geom_point()
输出:
示例 4:在Python中使用 plotnine 和 ggplot 绘制箱形图
Python3
import pandas as pd
from plotnine import ggplot, aes, geom_boxplot
# reading dataset
df = pd.read_csv("Iris.csv")
# passing the data to the ggplot
# constructor
ggplot(df) + aes(x="Species", y="SepalLengthCm") + geom_boxplot()
输出:
示例 5: Python中带有 plotnine 和 ggplot 的 Plottin 折线图
Python3
import pandas as pd
from plotnine import ggplot, aes, geom_line
# reading dataset
df = pd.read_csv("Iris.csv")
ggplot(df) + aes(x="Species", y="SepalLengthCm") + geom_line()
输出:
到目前为止,我们已经了解了如何使用图形语法的概念及其三个主要组成部分来创建基本图表。现在让我们学习如何使用其他可选组件自定义这些图表。
使用 plotnine 和 ggplot 增强数据可视化
在这里,我们将了解剩余的可选组件。这些组件是——
- 刻面
- 统计转换
- 坐标
- 主题
刻面
分面用于绘制数据子集。它允许对同一图像中的数据组进行单独的绘图。
例如,让我们考虑小费数据集,其中包含有关可能在餐厅用餐的人以及他们是否留下小费、年龄、性别等信息。让我们来看看它。
注意:要下载使用的数据集,请单击此处。
现在让我们假设我们想要根据性别和每天绘制总账单。在这种情况下,方面可能非常有用,让我们看看如何。
示例: Python中带有 plotnine 和 ggplot 的构面
Python3
import pandas as pd
from plotnine import ggplot, aes, facet_grid, labs, geom_col
# reading dataset
df = pd.read_csv("tips.csv")
(
ggplot(df)
+ facet_grid(facets="~sex")
+ aes(x="day", y="total_bill")
+ labs(
x="day",
y="total_bill",
)
+ geom_col()
)
输出:
统计转换
统计转换意味着在绘制数据之前计算数据。在直方图的情况下可以看出。现在让我们考虑上面的例子,我们想找到萼片长度列的测量值,现在我们想将该测量值分配到 15 列中。 plotnine 的 geom_histogram()函数自动计算并绘制此数据。
示例:在Python中使用 plotnine 和 ggplot 进行统计转换
Python3
import pandas as pd
from plotnine import ggplot, aes, geom_histogram
# reading dataset
df = pd.read_csv("Iris.csv")
ggplot(df) + aes(x="SepalLengthCm") + geom_histogram(bins=15)
输出:
坐标
坐标系定义了数据点与图上的 2D 图形位置的距离。让我们看看上面的直方图示例,我们想要水平绘制这个直方图。我们可以通过使用 coord_flip()函数来简单地做到这一点。
示例: Python中 plotnine 和 ggplot 中的坐标系
Python3
import pandas as pd
from plotnine import ggplot, aes, geom_histogram, coord_flip
# reading dataset
df = pd.read_csv("Iris.csv")
(
ggplot(df)
+ aes(x="SepalLengthCm")
+ geom_histogram(bins=15)
+ coord_flip()
)
输出:
主题
主题用于改善数据可视化的外观。 Plotnine 包含很多可以在 plotnine 的主题 API 中找到的主题。让我们将上面的示例与构面一起使用,并尝试使可视化更具交互性。
示例: Python中 plotnine 和 ggplot 中的主题
Python3
import pandas as pd
from plotnine import ggplot, aes, facet_grid, labs, geom_col, theme_xkcd
# reading dataset
df = pd.read_csv("tips.csv")
(
ggplot(df)
+ facet_grid(facets="~sex")
+ aes(x="day", y="total_bill")
+ labs(
x="day",
y="total_bill",
)
+ geom_col()
+ theme_xkcd()
)
输出:
我们还可以根据向该图表添加更多信息来填充颜色。我们可以使用 aes函数的 fill 参数为上图中的时间变量添加颜色。
绘制多维数据
到目前为止,我们已经看到了如何在构面的情况下绘制超过 2 个变量。现在假设我们要使用四个变量来绘制数据,使用 facets 执行此操作可能有点忙,但使用颜色我们只能在同一个图中绘制 4 个变量。我们可以使用 aes()函数的填充参数来填充颜色。
示例:在Python中为 plotnine 和 ggplot 添加颜色
Python3
import pandas as pd
from plotnine import ggplot, aes, facet_grid, labs, geom_col, theme_xkcd
# reading dataset
df = pd.read_csv("tips.csv")
(
ggplot(df)
+ facet_grid(facets="~sex")
+ aes(x="day", y="total_bill", fill="time")
+ labs(
x="day",
y="total_bill",
)
+ geom_col()
+ theme_xkcd()
)
输出:
保存绘图
我们可以使用 save() 方法简单地保存绘图。此方法会将绘图作为图像进行传输。
示例:在Python中保存 plotnine 和 ggplot
Python3
import pandas as pd
from plotnine import ggplot, aes, facet_grid, labs, geom_col, theme_xkcd
# reading dataset
df = pd.read_csv("tips.csv")
plot = (
ggplot(df)
+ facet_grid(facets="~sex")
+ aes(x="day", y="total_bill", fill="time")
+ labs(
x="day",
y="total_bill",
)
+ geom_col()
+ theme_xkcd()
)
plot.save("gfg plotnine tutorial.png")
输出: