#r #ggplot2
Вопрос:
У меня есть такой сюжет со следующим кодом:
aus_cases <- ggplot(data = daily_cases,aes(x= date, as.numeric(V1)))
geom_col(fill = 'blue', alpha= 0.6)
theme_minimal(base_size =14)
xlab(NULL)
ylab(NULL)
theme_bw()
scale_x_date(date_labels = "%d/%m/%Y")
И я хотел выделить 3 лучших значения на графике и также показать дату на графике, думал использовать gghighlight, но не уверен, как это сделать.
Ответ №1:
Используя ggplot2::economics
набор данных в качестве примера данных, вы можете выделить и пометить 3 лучших значения следующим образом:
- Добавьте индикатор для значений top3 в свой df, например, с помощью
rank
функции. - Чтобы выделить, нанесите на карту индикатор top3 при заполнении.
- Чтобы добавить даты, используйте geom_text для добавления меток только для значений top3
Попробуй это:
library(ggplot2)
library(dplyr)
# Example data
d <- filter(economics, date >= as.Date("2010-01-01"))
# Add top3 indicator
d <- mutate(d, top3 = rank(-psavert) %in% 1:3)
ggplot(data = d, aes(date, psavert, fill = top3))
geom_col(alpha = 0.6)
geom_text(aes(label = ifelse(top3, as.character(date), "")), nudge_y = .1)
scale_fill_manual(values = c("TRUE" = "red", "FALSE" = "blue"))
theme_minimal(base_size = 14)
xlab(NULL)
ylab(NULL)
theme_bw()
scale_x_date(date_labels = "%d/%m/%Y")
Комментарии:
1. Привет, большое вам спасибо за помощь. однако дата выделения была перекрыта, так как точки находятся слишком близко друг к другу. Есть идеи, как я могу решить эту проблему, чтобы четко указать дату и можно ли также указать номер дела? Спасибо!
2. Одним из вариантов был бы
ggrepel
пакет.ggrepel::geom_text_repel
использует алгоритм, который делает все возможное, чтобы предотвратить наложение меток (и меток, перекрывающих данные).
Ответ №2:
Вот один из способов сделать это. У вас не dput
было ваших данных, поэтому я использовал эти тестовые данные.
library(lubridate)
library(tidyverse)
library(gghighlight)
daily_cases <- data.frame(V1 = c(10,20,30, 10, 5, 10, 10, 40, 50, 10),
date = ymd("2020-02-01", "2020-02-02",
"2020-02-03","2020-02-04",
"2020-02-05","2020-02-06",
"2020-02-07","2020-02-08",
"2020-02-09","2020-02-10"))
Сначала я указал 3 лучших значения и их дату top
. И использовал эту информацию ggplot
в gghighlight (выделение трех полос) и scale_x_date (просто покажите даты выделенных полос).
top <- daily_cases %>%
arrange(desc(V1)) %>%
slice(1:3)
aus_cases <- ggplot(data = daily_cases,aes(x= date, as.numeric(V1)))
geom_col(fill = 'blue', alpha= 0.6)
gghighlight(V1 >= min(top$V1))
theme_minimal(base_size = 14)
xlab(NULL)
ylab(NULL)
theme_bw()
scale_x_date(breaks = top$date, date_labels = "%d/%m/%Y")
Вот такой сюжет.