R: Как я могу сделать метку смещения НЕ показывать десятичные разряды во время анимации - PullRequest
0 голосов
/ 13 апреля 2020

Я создаю анимированный график из набора данных (используя ggplot2, gganimate, ggrepel ...), но я не могу заставить этикетку округляться во время переходных кадров. Таким образом, он делает большое длинное десятичное число на этикетке. Я могу частично исправить это, установив текст метки в «as.factor» или «as.character», который будет отображать только фактическое значение каждой точки в наборе данных, но в идеале я бы хотел, чтобы он рос как это происходит с десятичными разрядами, но в виде целых чисел (или одного десятичного разряда). Я пытался использовать различные «круглые» функции, но это, похоже, не работает. Любые идеи? :)

Код:

#################################################
# set libraries ----
library(fredr)
library(zoo)
library(tidyverse)
library(lubridate)
library(gganimate)
library(ggrepel)
library(dplyr)
library(readr)
library(ggplot2)
library(scales)
library(readxl)

################################################


# Import Data from XLS
my_data <- read_excel("C:\\Users\\xxx\\OneDrive\\Desktop\\total-world.xlsx")


a3 <- 

  # Decimal Places in Label when annimated
  #  ggplot(data=my_data, aes(x=Date,y=Cases,label = as.character(Cases) ))+
  ggplot(data=my_data, aes(x=Date,y=Cases,label = Cases ))+
  geom_line()+
  view_follow()+

  geom_point(color="red", size = 4)+
  geom_line(size = 1, colour="#FFFFFF") +
  geom_area(color="white", fill="#093e58", alpha = 0.4)+
  geom_label_repel(aes(label = round(Cases,1)),
                    segment.colour = "black",
                   fontface = 'bold',
                   box.padding = unit(0.5, "lines"),
                   point.padding = unit(1, "lines"),
                   segment.color = "Red"  ) +

  scale_y_continuous(labels=scales::comma_format())+
  transition_reveal(ind)+
  theme_gray()+

# Ugly, needs cleaning up...  
  theme(plot.caption=element_text(hjust=0))+
  theme(plot.title = element_text(color = "#ff9e2a", size = 15, face = "bold"))+
  theme(plot.subtitle = element_text(color = "yellow", size = 15, face = "bold"))+
  theme(plot.caption = element_text(color = "green", size = 12, face = "bold"))+
  theme(panel.background = element_rect(fill = "#141e24", colour = "#141e24"))+
  theme(plot.background = element_rect(fill = "black"))+
  theme(panel.grid.major = element_line(colour = "#203039", linetype = "dashed"))+
  theme(panel.grid.minor = element_line(colour = "#203039", linetype = "dashed"))+
  theme(axis.text.x = element_text(face="bold", color="white", size=14))+
  theme(axis.text.y = element_text(face="bold", color="white", size=14))+
  theme(axis.title.y = element_text(margin = unit(c(0, 5, 0, 0), "mm"), angle = 0)  )+


  labs(x="",y="Cases",
       title="Worldwide Covid-19 Cases Since the Start",
       subtitle="... stay safe out there ...",
       caption="Harry Royden McLaughlin - Source: ourworldindata.org \n Updated 04-11-2020")


animate(a3,end_pause=40, nframes=350,fps=12)
save_animation(last_animation(), file="C:\\Users\\xxx\\OneDrive\\Desktop")

Изображение: Десятичные знаки в метке смещения

1 Ответ

0 голосов
/ 21 апреля 2020

Это может быть ошибка с gganimate, но я вижу то же самое в этом примере набора данных и графика:

df1 <- data.frame(x=rnorm(10,1,0.1), y=rnorm(10,1,0.1), t=1)
df2 <- data.frame(x=rnorm(10, 1, 0.12), y=rnorm(10, 1, 0.12), t=2)
df3 <- data.frame(x=rnorm(10, 1, 0.15), y=rnorm(10, 1, 0.15), t=3)
df <- rbind(df1, df2, df3)

p <- ggplot(df, aes(x,y)) + geom_point() + xlim(0.5,1.5) + ylim(0.5,1.5) +
    geom_text_repel(aes(label=round(y,2)))

Вот график без анимации:

enter image description here

Вот что происходит при анимации:

p + transition_time(t)

enter image description here

Вот исправление, которое работает, если вы используете as.character(round(y,2)) для label эстетики. Я должен признать, я понятия не имею , почему это работает, но это делает:

p <- ggplot(df, aes(x,y)) + geom_point() + xlim(0.5,1.5) + ylim(0.5,1.5) +
    geom_text_repel(aes(label=as.character(round(y,2))))

p + transition_time(t)

enter image description here

Один последний момент : вы называете label= aestheti c дважды в своем сюжете, даже если он используется только в geom_text_repel. Для эстетики, которые используются на протяжении всего сюжета. Обычно рекомендуется указывать эстетику один раз , особенно если они конфликтуют друг с другом. Это делается для того, чтобы убедиться, что aestheti c, примененный к вашему geom, является правильным. Я почти уверен, что для этого случая это не будет иметь большого значения, но я все же рекомендовал бы использовать объявление label= aestheti c либо только с geom_text_repel или с ggplot.

...