R中的ggplot的分面

本文概述

介绍

使用构面, 可以制作多面板图并控制一个面板的比例与另一个面板的比例。

内容

1)简单的分面用法

2)自定义布局并重新排序

3)刻面

4)玩天秤和空间

5)使用构面创建细分

简单的分面用法

如果你完全熟悉ggplot, 则将了解ggplot()函数的调用的基本结构。有关ggplot的介绍, 你可以在此处查看srcmini ggplot课程。调用ggplot时, 你需要提供一个数据源(通常是一个数据框), 然后要求ggplot将我们数据源中的不同变量映射到不同的外观, 例如x轴或y轴的位置或我们的点或条的颜色。使用构面, 你可以获得映射变量的其他方法。为了说明这一点, 你将使用以下数据集, 其中包括一些国家/地区的经济指标。其中大多数是GDP(每个国家的国内生产总值)的变体。

print(econdata)
##   Country  GDP_nom  GDP_PPP GDP_nom_per_capita GDP_PPP_per_capita
## 1     USA 19390600 19390600              59501              59495
## 2  Canada  1652412  1769270              45077              48141
## 3   China 12014610 23159107               8643              16807
## 4   Japan  4872135  5428813              38440              42659
## 5  France  2583560  2835746              39869              43550
## 6 Germany  3684816  4170790              44550              50206
## 7  Sweden  3684816   520937              53218              51264
## 8 Ireland   333994   343682              70638              72632
##   GNI_per_capita        Region
## 1          58270 North America
## 2          42870 North America
## 3           8690          Asia
## 4          38550          Asia
## 5          37970        Europe
## 6          43490        Europe
## 7          52590        Europe
## 8          55290        Europe

存在以下变量:

国家:不言自明!

GDP_nom:国内生产总值(美元)名义价值

GDP_PPP:受不同购买力控制的国内生产总值

GDP_nom_per_capita:人均国内生产总值名义价值(美元)

GDP_PPP_per_capita:受人均购买力控制的国内生产总值

GNI_per_capita:每个国家的人均国民总收入。

地区:国家/地区所在的世界地区。

首先, 让我们对每个国家的名义GDP进行简单绘制。

ggplot(econdata, aes(x=Country, y=GDP_nom))+
  geom_bar(stat='identity', fill="forest green")+
  ylab("GDP (nominal)")
R中的ggplot的分面1

你还可以绘制另一个变量, 即购买力平价调整后的GDP。

ggplot(econdata, aes(x=Country, y=GDP_PPP))+
  geom_bar(stat='identity', fill="forest green")+
  ylab("GDP (PPP)")
R中的ggplot的分面2

这为你提供了第二张单独的图, 类似于上一张, 但是使用了一个不同的变量。假设你要同时绘制GDP(名义)和GDP(PPP)。你将使用构面来执行此操作。首先, 你需要重新格式化数据, 将数据从”宽”格式(每个变量在其自己的列中)更改为”长”格式, 在此你将一列用于度量, 另一列用于关键变量, 从而告诉我们我们在每一行中使用的度量。

econdatalong <- gather(econdata, key="measure", value="value", c("GDP_nom", "GDP_PPP"))

一旦获得了这种格式的数据, 就可以使用我们的键变量来进行刻面绘制。让我们构建一个简单的图, 同时显示名义GDP(来自我们的第一个图)和GDP(PPP)(来自我们的第二个图)。为此, 你只需修改代码以添加+ facet_wrap()并指定〜measure(我们的关键变量)应用于构面。

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure)
R中的ggplot的分面3

这可行, 但是你会注意到国家名称的压缩程度。让我们重新排列面板。

自定义布局和重新排序

facet_wrap()命令将自动选择要使用的列数。你可以直接使用ncol =进行指定, 如下所示:

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure, ncol=1)
R中的ggplot的分面4

你可能会注意到, 以上x轴上的国家/地区按字母顺序排列。如果要更改此设置, 最简单的方法是设置”国家/地区”因子的级别。让我们执行此重新排序, 以总名义GDP的顺序排列国家/地区。

econdata$Country <- factor(econdata$Country, levels= econdata$Country[order(econdata$GDP_nom)])


econdatalong <- gather(econdata, key="measure", value="value", c("GDP_nom", "GDP_PPP"))


ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure, ncol=1)
R中的ggplot的分面5

你还可以进行一些额外的自定义, 例如, 使用strip.position参数将构面标签移到左侧。

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure, ncol=1, strip.position = "left")
R中的ggplot的分面6

贴标签面

你可能已经注意到, 从要素测度的角度来看, 这些分面具有简单的短标题。让我们整理一下, 给我们的分面打上更好的标签。为此, 你将创建一个简单的标签程序功能, variable_labeller, 当要求输入variable_names的值之一时, 该函数将返回适当的名称。然后, 将此函数传递给facet_wrap的labeller参数。

variable_names <- list(
  "GDP_nom" = "GDP (nominal)" , "GDP_PPP" = "GDP (purchasing power parity)"
)


variable_labeller <- function(variable, value){
  return(variable_names[value])
}


ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure, ncol=1, labeller=variable_labeller)
R中的ggplot的分面7

玩天秤和空间

让我们使用每种经济措施来构建一个更大的多面图。

econdatalong <- gather(econdata, key="measure", value="value", c( "GDP_nom" , "GDP_PPP" , "GDP_nom_per_capita", "GDP_PPP_per_capita" , "GNI_per_capita"))

variable_names <- list(
  "GDP_nom" = "GDP (nominal)" , "GDP_PPP" = "GDP (purchasing power parity)", "GDP_nom_per_capita" = "GDP (nominal) per capita", "GDP_PPP_per_capita" = "GDP (purchasing power parity) per capita", "GNI_per_capita"  = "GNI per capita"
)


variable_labeller <- function(variable, value){
  return(variable_names[value])
}



ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure, ncol=1, labeller= variable_labeller)+
scale_y_continuous(breaks = pretty(econdatalong$value, n = 10))
R中的ggplot的分面8

那根本不好!你看不到三个面板的值。这是为什么?让我们看一下主要数据以了解原因。

summary(econdata)
##     Country     GDP_nom            GDP_PPP         GDP_nom_per_capita
##  Ireland:1   Min.   :  333994   Min.   :  343682   Min.   : 8643     
##  Canada :1   1st Qu.: 2350773   1st Qu.: 1457187   1st Qu.:39512     
##  France :1   Median : 3684816   Median : 3503268   Median :44814     
##  Germany:1   Mean   : 6027118   Mean   : 7202368   Mean   :44992     
##  Sweden :1   3rd Qu.: 6657754   3rd Qu.: 8919260   3rd Qu.:54789     
##  Japan  :1   Max.   :19390600   Max.   :23159107   Max.   :70638     
##  (Other):2                                                           
##  GDP_PPP_per_capita GNI_per_capita            Region
##  Min.   :16807      Min.   : 8690   Asia         :2  
##  1st Qu.:43327      1st Qu.:38405   Europe       :4  
##  Median :49174      Median :43180   North America:2  
##  Mean   :48094      Mean   :42215                    
##  3rd Qu.:53322      3rd Qu.:53265                    
##  Max.   :72632      Max.   :58270                    
##

如果查看每列, 你会发现每列中的值范围都在几个数量级上。默认情况下, 构面将对X轴和Y轴使用相同的限制和范围。要更改此设置, 可以将此代码段添加到构面代码中:scales =” free_y”, 以便每个构面将使用其自己的独立尺度。

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure, scales="free_y", ncol=1, labeller= variable_labeller)
R中的ggplot的分面9

这样好多了。现在, 每个构面都有自己的独立y轴。

使用构面创建细分

你可能已经注意到, 我们的数据集还包含变量Region, 这表示该国家/地区位于哪个区域。你可以使用此变量根据区域为条形着色, 如下所示:

ggplot(econdatalong, aes(x=Country, y=value, fill=Region))+
  geom_bar(stat='identity')+
  facet_wrap(~measure, scales="free_y", ncol=1, labeller= variable_labeller)
R中的ggplot的分面10

但是, 这有点混乱, 如果你可以将每个不同的区域放在各自的子面板中, 这不是很好吗?好吧, 有了分面, 你可以!在这里, 你将使用facet_grid而不是facet_wrap, 因为这样可以轻松地将我们的构面映射到两个变量Region和measure, 这两个变量都分布在绘图网格的行和列中。请注意, 你还设置了scales =” free”和space =” free”, 以允许我们的不同面板占用不同的空间量。你还需要创建一个新的labeller函数, 该函数将为行和标签生成名称。


variable_names <- list(
  "GDP_nom" = "GDP \n(nominal)" , "GDP_PPP" = "GDP \n(PPP)", "GDP_nom_per_capita" = "GDP (nominal)\n per capita", "GDP_PPP_per_capita" = "GDP (PPP)\n per capita", "GNI_per_capita"  = "GNI \nper capita"
)



region_names <- levels(econdata$Region)


variable_labeller2 <- function(variable, value){
  if (variable=='measure') {
  return(variable_names[value])
  } else {
    return(region_names)
  }
}

ggplot(econdatalong, aes(x=Country, y=value, fill=Region))+
  geom_bar(stat='identity')+
  facet_grid(measure~Region, scales="free", space="free_x", labeller= variable_labeller2)
R中的ggplot的分面11

现在更加清晰了!每个区域都有自己的一列面板, 每个指标都有自己的横条。

关于此内容, 本教程将对其进行总结。我希望你喜欢学习分面。

如果你想了解有关分面的更多信息, 请参加srcmini的Trelliscope可视化大数据课程。

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?