Выделите 3 лучших значения

#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 лучших значения следующим образом:

  1. Добавьте индикатор для значений top3 в свой df, например, с помощью rank функции.
  2. Чтобы выделить, нанесите на карту индикатор top3 при заполнении.
  3. Чтобы добавить даты, используйте 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")

 

Вот такой сюжет.

введите описание изображения здесь