title: "添加数据标签"
author: "wintryheart"
date: "2019/7/21"
output: html_document
knitr::opts_chunk$set(echo = TRUE)
数据
library(reshape2)
y2000 <- c(77.17, 11.46, 11.38)
y2010 <- c(68.23, 16.4,15.37)
nesttype <- c("与子女生活","独居空巢","夫妻空巢")
emptynest <- data.frame(nesttype,y2000, y2010)
knitr::kable(emptynest)
emptynest2 <- melt(emptynest, id.vars = "nesttype", variable.name = "year", value.name = "proportion")
with(emptynest2,
nesttype <- factor(nesttype, levels = c("与子女生活","夫妇空巢","独居空巢"), labels = c("与子女生活","夫妇空巢","独居空巢"), ordered=T),
year <- substr(year, 2, 5)
)
简单的条形图
library(ggplot2)
library(gridExtra)
p1 <- ggplot(emptynest2, aes(x=nesttype, y=proportion)) + geom_bar(aes(fill=year), position="dodge", stat="identity")
p2 <- ggplot(emptynest2, aes(x=nesttype, y=proportion)) + geom_col(aes(fill=year), position="dodge")
grid.arrange(p1, p2, ncol=1)
- geom_col()和geom_bar()的区别在于,geom_col()默认使用原数据,而geom_bar()默认进行count。
group分组问题
在上图上,ggplot()并没有设置aes()的group参数。这种做法不影响geom_bar(),但是影响geom_text(),使得数据标签不能正确显示。
p3 <- ggplot(emptynest2, aes(x=nesttype, y=proportion)) +
geom_col(aes(fill=year), position="dodge") +
geom_text(aes(label=proportion, y=proportion+0.05), position=position_dodge(0.9), vjust=0)
p4 <- ggplot(emptynest2, aes(x=nesttype, y=proportion, group=year)) +
geom_col(aes(fill=year), position="dodge") +
geom_text(aes(label=proportion, y=proportion+0.05), position=position_dodge(0.9), vjust=0)
grid.arrange(p3,p4,ncol=1)
13.png
geom_text()的参数设置问题
position问题
对于多组数据,不能直接设置,而要用position_dodge()设置不同组之间标签的避开宽度(dodging width)。
ggplot(emptynest2, aes(x=nesttype, y=proportion, group=year)) +
geom_col(aes(fill=year), position="dodge") +
geom_text(aes(label=proportion, y=proportion+0.05), position="dodge", vjust=0)
ggplot(emptynest2, aes(x=nesttype, y=proportion, group=year)) +
geom_col(aes(fill=year), position="dodge") +
geom_text(aes(label=proportion, y=proportion+0.05), position=position_dodge(0.9), vjust=0)
21.png
22.png
vjust问题
vjust选项调节数据标签相对于条形顶部的位置。默认为0.5。
ggplot(emptynest2, aes(x=nesttype, y=proportion, group=year)) +
geom_col(aes(fill=year), position="dodge") +
geom_text(aes(label=proportion, y=proportion+0.05), position=position_dodge(0.9))
ggplot(emptynest2, aes(x=nesttype, y=proportion, group=year)) +
geom_col(aes(fill=year), position="dodge") +
geom_text(aes(label=proportion, y=proportion+0.05), position=position_dodge(0.9), vjust=0)
ggplot(emptynest2, aes(x=nesttype, y=proportion, group=year)) +
geom_col(aes(fill=year), position="dodge") +
geom_text(aes(label=proportion, y=proportion+0.05), position=position_dodge(0.9), vjust=1)
31.png
32.png
33.png
aes()问题
目的是抬升标签的位置,使得标签脱离条形的顶部。默认是贴合。
ggplot(emptynest2, aes(x=nesttype, y=proportion, group=year)) +
geom_col(aes(fill=year), position="dodge") +
geom_text(aes(label=proportion), position=position_dodge(0.9), vjust=0)
ggplot(emptynest2, aes(x=nesttype, y=proportion, group=year)) +
geom_col(aes(fill=year), position="dodge") +
geom_text(aes(label=proportion, y=proportion+1), position=position_dodge(0.9), vjust=0)
41.png
42.png
附录
下面内容节选自geom_text()帮助文件。
# Aligning labels and bars --------------------------------------------------
df <- data.frame(
x = factor(c(1, 1, 2, 2)),
y = c(1, 3, 2, 1),
grp = c("a", "b", "a", "b")
)
# ggplot2 doesn't know you want to give the labels the same virtual width
# as the bars:
ggplot(data = df, aes(x, y, group = grp)) +
geom_col(aes(fill = grp), position = "dodge") +
geom_text(aes(label = y), position = "dodge")
# So tell it:
ggplot(data = df, aes(x, y, group = grp)) +
geom_col(aes(fill = grp), position = "dodge") +
geom_text(aes(label = y), position = position_dodge(0.9))
# Use you can't nudge and dodge text, so instead adjust the y position
ggplot(data = df, aes(x, y, group = grp)) +
geom_col(aes(fill = grp), position = "dodge") +
geom_text(
aes(label = y, y = y + 0.05),
position = position_dodge(0.9),
vjust = 0
)
# Justification -------------------------------------------------------------
df <- data.frame(
x = c(1, 1, 2, 2, 1.5),
y = c(1, 2, 1, 2, 1.5),
text = c("bottom-left", "bottom-right", "top-left", "top-right", "center")
)
ggplot(df, aes(x, y)) +
geom_text(aes(label = text))
ggplot(df, aes(x, y)) +
geom_text(aes(label = text), vjust = "inward", hjust = "inward")
51.png
52.png
53.png
61.png
62.png
网友评论