r语言和python画图_Python语言plotnine VS R语言ggplot2

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大数据分析小站

你可能感兴趣的:(r语言和python画图)