[英]ggplot : how add labels to multiple plot (with geom_text, no legend)?
知道如何将标签直接添加到我的 plot (geom_text) 吗?
这是我的样本 dataframe,我正在绘制三条曲线(确认、死亡、康复)但是如何在其中添加 colname 标签? 我从 csv 文件中读取了 dataframe。
print (data)
date confirmed deaths recovered
1 2020-12-01 63883985 1481306 41034934
2 2020-12-02 64530517 1493742 41496318
3 2020-12-03 65221040 1506260 41932091
4 2020-12-04 65899441 1518670 42352021
5 2020-12-05 66540034 1528868 42789879
6 2020-12-06 67073728 1536056 43103827
这是我的代码:
data <- structure(list(date = structure(1:6, .Label = c("2020-12-01",
"2020-12-02", "2020-12-03", "2020-12-04", "2020-12-05", "2020-12-06"
), class = "factor"), confirmed = c(63883985L, 64530517L, 65221040L,
65899441L, 66540034L, 67073728L), deaths = c(1481306L, 1493742L,
1506260L, 1518670L, 1528868L, 1536056L), recovered = c(41034934L,
41496318L, 41932091L, 42352021L, 42789879L, 43103827L)), row.names = c(NA,
6L), class = "data.frame")
ggplot(data, aes(x = date, y = confirmed, group=1 ) ) +
geom_line(colour = "blue", size =1, aes(date, confirmed)) +
scale_y_continuous(labels = unit_format(unit = "M", scale = 1e-6)) +
geom_line(color = "red", size = 1, aes(date, deaths)) +
geom_line(color = "#1EACB0", size = 1, aes(date, recovered))
这是我当前的 plot 没有标签,我也尝试使用此代码label=colnames(stats_data)
,但不是这样工作的,
正如 Roman 链接的帖子中提到的, ggrepel
是一个不错的选择。 请注意,您可以使用我创建的变量lab_date
调整您希望 label 落在的位置。
# load packages
library(tidyverse)
library(scales)
library(ggrepel)
# process data for plotting
data1 <- data %>%
mutate(date = as.Date(date)) %>%
pivot_longer(cols = -date, names_to = "category", values_to = "cases") %>%
mutate(category = factor(category))
# set color scheme with named vector
color_scheme <- setNames(c("blue", "red", "#1EACB0"), unique(data1$category))
# determine position of label
lab_date <- data1$date %>%
as.numeric(.) %>% # convert to numeric for finding desired potition
quantile(., 0.5) %>% # selects middle of range but you can adjust as needed
as.Date(., origin = "1970-01-01") %>% # convert back to date
as.character() # convert to string for matching in geom_label_repel call
# plot lines with labels and drop legend
data1 %>%
ggplot(data = ., aes(x = date, y = cases, color = category)) +
geom_line() +
geom_label_repel(aes(label = category),
data = data1 %>% filter(date == lab_date)) +
scale_y_continuous(labels = unit_format(unit = "M", scale = 1e-6)) +
scale_color_manual(values = color_scheme) +
theme(legend.position = "none")
给出以下 plot:
一些更新说明:
scale_color_manual
中,即使类别的顺序发生变化或一个不存在,它也会保留配色方案。lab_date <- "2020-12-03"
或您需要的任何内容。geom_label
而不是geom_label_repel
会得到几乎完全相同的结果,因此对于相对较少数量的标签来说可能被认为是无偿的,尽管如果这很重要,它确实有助于使 label 下线。plotly::ggplotly
不支持ggrepel
甚至ggplot2::geom_label
。 因此,如果您需要将 go 变为 plotly,一种选择是将geom_label_repel
更改为geom_text
,但如果您不调整 y position,它会将 plot 置于该行的顶部。见下文:ggplotly(
data1 %>%
ggplot(data = ., aes(x = date, y = cases, color = category)) +
geom_line() +
geom_text(aes(label = category),
data = data1 %>%
filter(date == lab_date) %>%
mutate(cases = cases + 2e6)) + # this adjusts the y position of the label to avoid overplotting on the line
scale_y_continuous(labels = unit_format(unit = "M", scale = 1e-6)) +
scale_color_manual(values = color_scheme) +
theme(legend.position = "none")
)
产生这个 plot:
您要调整的数量将取决于线条粗细、您的数据的具体值和 plot 的大小,因此它更像是一种 hack,而不是一个强大的解决方案。
这类问题通常与重塑数据有关。 格式应该是长格式,数据是宽格式。 请参阅这篇关于如何将数据从宽格式重塑为长格式的帖子。
library(dplyr)
library(tidyr)
library(ggplot2)
stats_data %>%
select(-starts_with("diff")) %>%
pivot_longer(-date, names_to = "cases", values_to = "count") %>%
mutate(cases = factor(cases, levels = c("confirmed", "deaths", "recovered"))) %>%
ggplot(aes(date, count, colour = cases)) +
geom_line() +
scale_color_manual(values = c("blue", "red", "#1EACB0"))
数据
stats_data <- read.table(text = "
date confirmed diff.x deaths diff.y recovered
'2020-01-22' 555 555 17 17 28
'2020-01-23' 654 99 18 1 30
'2020-01-24' 941 287 26 8 36
'2020-01-25' 1434 493 42 16 39
'2020-01-26' 2118 684 56 14 52
'2020-01-27' 2927 809 82 26 61
", header = TRUE, colClasses = c("Date", rep("numeric", 5)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.