从上一课的初步体验中,我们已经获悉,只要加载了数据,并创建了“美学映射”之后,也就有了绘图的基础,然后要思考的就是:做什么形状的图,是散点图,还是箱线图?这些图就是所谓的“几何对象”,每个几何对象都是一个图层——也可以看做一个对象。正是基于这个认识,p9.geom_* 等这些几何对象才都是类,每个图层也就是某个类的实例。
3.2.1 几何对象
原来曾经写过的:
(p9.ggplot(mg)
+ p9.aes(x='displ', y='hwy', color='factor(cyl)')
+ p9.geom_point()
)
还可以用下面的方式写:
%matplotlib inline
import plotnine as p9
from plotnine import data
base_plot = p9.ggplot(data.mpg, p9.aes(x='displ', y='hwy', color='factor(cyl)')) #①
base_plot + p9.geom_point() #②
输出结果:
image① 的 p9.ggplot 返回的是一个图层对象,其中包含了数据和美学映射关系,而后这个对象与一个几何对象(图层)相加(② 所示),就相当于图层叠加,最终得到了上述结果。
我曾在 Python 基础课程中很明确地讨论过“+”的运算(参见《跟老齐学 Python:轻松入门》),能够参与“+”运算的,都是 Python 中的对象——内置对象(如整数、浮点数、字符串、列表等)或者自定义的对象——注意都是对象,或者说只有对象才能参与此运算。② 实现增加图层,因为图层是对象,也就意味着最终的图示就是多个图层对象相加。
既然如此,那么每个图层对象都有自己的属性,通过对本图层的设置,会让可视化控制更灵活。
(p9.ggplot(data.mpg)
+ p9.aes(x='displ', y='hwy') #③
+ p9.geom_point(p9.aes(color='factor(cyl)')) #④
+ p9.geom_smooth()
)
输出结果:
image如果与上一节的类似图示进行比较,那条代表回归规律的曲线有了变化,现在没有再被颜色分为若干部分了,而是统一的一条线(下图是上一节得到的图示)。
image之所以有这样的变化,是因为 ③ 创建美学映射图层——这个图层被后续图层使用——没有了 color='factor(cyl)',而是将这种映射移到了 ④,也就是专门对 ④ 创建的图层对象配置了 p9.aes(color='factor(cyl)'),其他层就没有这种映射关系了。
以下是 geom_point 的参数:
geom_point(mapping=None, data=None, stat='identity', position='identity',
na_rm=False, inherit_aes=True, show_legend=None, **kwargs)
其他的类都与此差不多。从这里可以看出,每个图层对象,都可以为该层设置数据、映射关系等属性,如果该图层对象的属性与 p9.ggplot 中设置的重名,则不再调用 p9.ggplot 中的值。
3.2.2 美学映射
虽然前面已经多少了解了“美学映射”—— 其实就是 “映射”,加上 “美学”,更显得是一个独特的专有名词 —— 但是对它的领悟,恐怕还要继续。
(p9.ggplot(data.mpg)
+ p9.aes(x='displ', y='hwy')
+ p9.geom_point(p9.aes(color='factor(cyl)',size='hwy'))
+ p9.geom_smooth(color='red')
)
输出结果:
image观察图示结果,丰富了各个图层的属性。凝视此图,对 “美学映射” 会有所悟,即将数据集中的某个特征与可视化的图示中某个图像元素(图对象属性)建立映射关系,将该特征的数据用可视化的美学方式表示出来。比如,在上述例子中:
- 将数据集中的 “displ” 特征与坐标系的 X 轴建立映射关系,即用 X 轴的点表示此特征中的数据;
- 将数据集中的 “hwy” 特征与图示中点的直径尺寸建立映射关系,即用不同大小的点表示此特征的数据——此特征数据是分类数据。
并且,每个图层对象中都可以创建各自的映射,如果本图层没有特别给 mapping 参数赋值,将继承 p9.ggplot 所创建的映射关系。
(p9.ggplot(data.mpg)
+ p9.aes(x='displ', y='hwy')
+ p9.geom_point(p9.aes(color='factor(cyl)',size='hwy'))
+ p9.geom_smooth(color='red')
+ p9.xlab("engine displacement(L)") #⑤
)
输出结果:
网友评论