本文概述
介绍
使用构面, 可以制作多面板图并控制一个面板的比例与另一个面板的比例。
内容
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)")
你还可以绘制另一个变量, 即购买力平价调整后的GDP。
ggplot(econdata, aes(x=Country, y=GDP_PPP))+
geom_bar(stat='identity', fill="forest green")+
ylab("GDP (PPP)")
这为你提供了第二张单独的图, 类似于上一张, 但是使用了一个不同的变量。假设你要同时绘制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)
这可行, 但是你会注意到国家名称的压缩程度。让我们重新排列面板。
自定义布局和重新排序
facet_wrap()命令将自动选择要使用的列数。你可以直接使用ncol =进行指定, 如下所示:
ggplot(econdatalong, aes(x=Country, y=value))+
geom_bar(stat='identity', fill="forest green")+
facet_wrap(~measure, ncol=1)
你可能会注意到, 以上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)
你还可以进行一些额外的自定义, 例如, 使用strip.position参数将构面标签移到左侧。
ggplot(econdatalong, aes(x=Country, y=value))+
geom_bar(stat='identity', fill="forest green")+
facet_wrap(~measure, ncol=1, strip.position = "left")
贴标签面
你可能已经注意到, 从要素测度的角度来看, 这些分面具有简单的短标题。让我们整理一下, 给我们的分面打上更好的标签。为此, 你将创建一个简单的标签程序功能, 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)
玩天秤和空间
让我们使用每种经济措施来构建一个更大的多面图。
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))
那根本不好!你看不到三个面板的值。这是为什么?让我们看一下主要数据以了解原因。
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)
这样好多了。现在, 每个构面都有自己的独立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)
但是, 这有点混乱, 如果你可以将每个不同的区域放在各自的子面板中, 这不是很好吗?好吧, 有了分面, 你可以!在这里, 你将使用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)
现在更加清晰了!每个区域都有自己的一列面板, 每个指标都有自己的横条。
关于此内容, 本教程将对其进行总结。我希望你喜欢学习分面。
如果你想了解有关分面的更多信息, 请参加srcmini的Trelliscope可视化大数据课程。