ggplot2包是由Hadley Wickham在2005年创造。相对于R中的基础可视化包,是基于图形语法的绘图包,一经提出就迅速受到广大R语言使用者的喜爱。ggplot2包利用图层叠加的绘图方式,往图像上不断的添加图形元素、注释、统计结果等内容。
plotnine库可以看作是在Python中对ggplot2包的一种实现,方便Python对数据可视化的应用。
本文章会分别介绍在R和Python中,如何使用相关的库进行数据可视化分析。对比分析两个库的使用情况。
1. ggplot2与plotnine数据可视化初探
在R语言中的ggplot2包数据可视化流程程序如下:
## 统一设置ggplot2默认的绘图风格
library(ggplot2)
theme_set(theme_bw(base_family = "STKaiti"))
library(ggplot2)## 导入包
data("mpg") ## 加载ggplot2包中自带的数据集
## ggplot2数据可视化流程
## 初始化绘图图层,并指定绘图的数据和坐标系X,Y轴使用的变量
p1
## 添加绘图使用的主题和相关设置图层
theme_minimal(base_family = "STKaiti",base_size = 12)+
## 添加绘制图像的类型图层,并指定是否根据不同的种类以不同样式显示
geom_point(aes(colour = drv,shape = drv),size = 2)+
## 添加新的平滑曲线图层,使用广义回归模型拟合
geom_smooth(aes(colour = drv),method = "glm")+
## 设置图像的标题和坐标轴的标签
labs(x = "发动机排量",y = "油耗",title = "mpg数据集")+
## 添加主题图层对图像进一步调整
theme(plot.title = element_text(hjust = 0.5), # 调整标题位置
legend.position = c(0.9,0.8), # 调整图例位置
legend.title = element_text(size=10))+ #调整图例字体大小
## 对坐标轴的内容进行调整
scale_x_continuous(labels = function(x) paste(x,"升",sep = ""))+
## 对图例中的颜色映射和名称进行调整
scale_color_brewer("驱动方式",palette = "Set1")+
scale_shape_discrete("驱动方式")
## 输出图像p1
p1
运行程序后可获得如下所示的可视化图像:图1 R语言ggplot2数据可视化图像1
针对上面的图像,在Python中可使用下面的程序进行数据可视化:
## 显示高清图
%config InlineBackend.figure_format = 'retina'
## 导入相关库和模块
import pandas as pd
import numpy as np
from plotnine import *
from plotnine.data import mpg
import matplotlib.pyplot as plt
from matplotlib import gridspec
theme_set(theme_bw(base_family = "STKaiti"))
## plotnine数据可视化流程
## 初始化绘图图层,并指定绘图的数据和坐标系X,Y轴使用的变量
p1 = (ggplot(mpg,aes(x = "displ",y = "cty"))
## 添加绘图使用的主题和相关设置图层
+theme_minimal(base_family="STKaiti",base_size = 12)
## 添加绘制图像的类型图层,并指定是否根据不同的种类以不同样式显示
+geom_point(aes(colour = "drv",shape = "drv"),size=2)
## 添加新的平滑曲线图层,使用广义回归模型拟合
+geom_smooth(aes(colour = "drv"),method = "glm")
## 设置图像的标题和坐标轴的标签
+labs(x = "发动机排量",y = "油耗",title = "mpg数据集")
## 添加主题图层对图像进一步调整
+theme(plot_title = element_text(hjust = 0.5), # 调整标题位置
legend_position = (0.9,0.8), # 调整图例位置
legend_title = element_text(size=10)) #调整图例字体大小
## 对坐标轴的内容进行调整
+scale_x_continuous(breaks = (2,3,4,5,6,7),
labels = [str(x)+"升" for x in [2,3,4,5,6,7]])
## 对图例中的颜色映射和名称进行调整
+scale_color_brewer(name = "驱动方式",palette = "Set1",type="qual")
+scale_shape_discrete(name = "驱动方式")
)
p1
运行上面程序后可获的如下所示的图像。图2 Python中plotnine库数据可视化图像1
两者绘图程序的主要差异为:某些参数名称有差异,Python中使用的数据特征需要使用“”包裹,一些参数的取值可以使用数组或列表进行替换。
2. ggplot2与plotnine中常用的数据可视化函数
R中的ggplot2库的函数可视化程序如下:
# 使用不同的几何对象绘制不同的图像,导入会使用到的相关包
library(ggplot2);library(gridExtra);library(RColorBrewer);
## 使用q-q图检测数据的分布
p1
geom_qq(colour = "blue")+geom_qq_line(colour = "red")+
ggtitle("geom_qq+geom_qq_line")
## 可视化添加了误差线的条形图,数据准备
mpgclass
colnames(mpgclass)
## 误差线的上下界
mpgclass$ymin
mpgclass$ymax
## 可视化图像
p2
geom_bar(stat = "identity",fill = "red",alpha = 0.6)+
geom_errorbar(aes(ymin = ymin,ymax=ymax),width=0.5,colour = "blue")+
ggtitle("geom_bar+geom_errorbar")+labs(x = "")+coord_flip()
## 可视化小提琴图和抖动的散点图
p3
geom_violin(weight = 0.5,alpha = 0.5)+geom_jitter(width = 0.2)+
theme(legend.position = "none")+labs(x = "驱动方式")+
ggtitle("geom_violin+geom_jitter")
## 可视化直方图分析变量的分布
p4
geom_histogram(aes(y = ..density..),position = "identity",
binwidth = 0.25,fill = "red",alpha = 0.5)+
geom_density(alpha = 0.2,colour = "blue")+
ggtitle("geom_histogram+geom_density")
## 二维封箱的热力图
p5
geom_bin2d(bins = 20)+geom_density2d(colour = "red")+
theme(legend.position = "none")+ggtitle("geom_bin2d+geom_density2d")
## 面积填充图可视化
## 生成数据
huron
p6
geom_ribbon(aes(ymin = level - 1, ymax = level + 1), fill = "lightblue") +
geom_line(aes(y = level),color = "red")+ggtitle("geom_ribbon+geom_line")
## 将6幅图像重新布局
grid.arrange(p1,p2,p3,p4,p5,p6,nrow = 2)图3 R语言ggplot2数据可视化图像2
Python中plotnine库常用可视化函数的使用如下所示:
## 使用q-q图检测数据的分布
p1 = (ggplot(mpg,aes(sample="displ"))
+geom_qq(colour = "blue")+geom_qq_line(colour = "red")
+ggtitle("geom_qq+geom_qq_line")
)
## 可视化添加了误差线的条形图,数据准备
mpgclass = pd.value_counts(mpg["class"]).reset_index()
mpgclass.columns=["car_type","Freq"]
## 误差线的上下界
mpgclass["ymin"] = mpgclass["Freq"] - [1,5,4,2,3,3,2]
mpgclass["ymax"] = mpgclass["Freq"] + [1,5,4,2,3,3,6]
## 可视化图像
p2 = (ggplot(mpgclass,aes(x = "car_type" ,y = "Freq"))
+geom_bar(stat = "identity",fill = "red",alpha = 0.6)
+geom_errorbar(aes(ymin = "ymin",ymax="ymax"),width=0.5,colour = "blue")
+ggtitle("geom_bar+geom_errorbar")+labs(x = "")+coord_flip()
)
## 可视化小提琴图和抖动的散点图
p3 = (ggplot(mpg,aes(x="drv",y = "displ",group = "drv",fill = "drv"))
+geom_violin(weight = 0.5,alpha = 0.5)+geom_jitter(width = 0.2)
+theme(legend_position = "none")+labs(x = "驱动方式")
+ggtitle("geom_violin+geom_jitter")
)
## 可视化直方图分析变量的分布
p4 = (ggplot(mpg,aes("displ"))+
geom_histogram(aes(y = "stat(density)"),position = "identity",
binwidth = 0.25,fill = "red",alpha = 0.5)
+geom_density(alpha = 0.2,colour = "blue")
+ggtitle("geom_histogram+geom_density")
)
## 二维封箱的热力图
p5 = (ggplot(mpg,aes(x="displ",y = "cty"))
+geom_bin2d(bins = 20)+geom_density_2d(colour = "red")
+theme(legend_position = "none")+ggtitle("geom_bin2d+geom_density2d")
)
## 面积填充图可视化
## 生成数据
np.random.seed(12)
huron = pd.DataFrame(data = {"year": np.arange(1875,1973), "level": 100*np.random.rand((1973-1875))})
huron["ymin"] = huron["level"]-20
huron["ymax"] = huron["level"]+20
p6 = (ggplot(huron, aes("year"))
+geom_ribbon(aes(ymin = "ymin", ymax = "ymax"), fill = "lightblue")
+geom_line(aes(y = "level"),color = "red")+ggtitle("geom_ribbon+geom_line")
)
## 将多个图像重新分配窗口可视化
fig = (ggplot()+geom_blank(data=mpg)+theme_void()).draw()
gs = gridspec.GridSpec(2,3) ## 初始化多个窗口
ax1 = fig.add_subplot(gs[0,0])
ax2 = fig.add_subplot(gs[0,1])
ax3 = fig.add_subplot(gs[0,2])
ax4 = fig.add_subplot(gs[1,0])
ax5 = fig.add_subplot(gs[1,1])
ax6 = fig.add_subplot(gs[1,2])
## 为多个窗口绘图
_ = p1._draw_using_figure(fig,[ax1])
_ = p2._draw_using_figure(fig,[ax2])
_ = p3._draw_using_figure(fig,[ax3])
_ = p4._draw_using_figure(fig,[ax4])
_ = p5._draw_using_figure(fig,[ax5])
_ = p6._draw_using_figure(fig,[ax6])
plt.tight_layout()
plt.show()图4 Python中plotnine库数据可视化图像2
3. ggplot2与plotnine中数据分面可视化
R语言中ggplot2的数据分面程序示例如下:
## 网格分面facet_grid()的使用,scales = "free_x"固定Y轴范围,灵活设置X轴
ggplot(data = mpg,aes(x = displ,y = cty,colour = drv,shape = drv))+
geom_point(show.legend = FALSE)+facet_grid(year~drv,scales = "free_x")+
labs(x = "发动机排量",y = "油耗",title = "mpg数据集")图5 R语言ggplot2数据可视化图像3
Python语言中plotnine库的数据分面程序示例如下:
## 网格分面facet_grid()的使用,scales = "free_x"固定Y轴范围,灵活设置X轴
p1 = (ggplot(data = mpg, mapping=aes(x = "displ",y = "cty",colour = "drv",shape = "drv"))
+geom_point(show_legend = False)+facet_grid("year ~ drv",scales = "free_x")
+labs(x = "发动机排量",y = "油耗",title = "mpg数据集")
)
p1
图6 Python中plotnine库数据可视化图像3
经过对比可以发现plotnine库的语法和ggplot2的语法很相似,而且得到的图像也几乎完全一致。
文章首发于微信公众号:Adam大数据分析小站