Как я могу создать визуал как прикрепленное изображение в R? - PullRequest
2 голосов
/ 09 июля 2019

Я хочу показать разницу между вариациями объемов очереди с 2017 по 2019 год, и я наткнулся на диаграмму, которую мне прислали из презентации, которую я хотел бы создать в R, так как я чувствую, что это будет лучший визуальный эффект. отобразить мои данные.

Я пытался создать диаграмму наклона по следующему URL-адресу, используя образцы данных с сайта в настоящее время:

http://r -statistics.co / Top50-Ggplot2-визуализаций-MasterList-R-Code.html # Склон% 20Chart

Это дает мне 2 оси внутри графика, но теперь я пытаюсь понять, как я добавляю цвет между ними, чтобы он выглядел как прикрепленное изображение. Я также посмотрел, как работает диаграмма с областями, один из URL, на который я посмотрел, был следующим:

https://www.displayr.com/how-to-make-an-area-chart-in-r/

так как изображение, которое у меня есть, кажется, представляет собой смесь диаграммы области и диаграммы уклона, так что я подумал, что я могу попытаться увидеть, есть ли какой-нибудь код из диаграммы области о том, как закрашиваются цвета, но это только показало мне атрибут, используемый для заполнения дисперсий.

Код, который я использовал, взят из приведенного выше URL (http://r -statistics.co / Top50-Ggplot2-Visualizations-MasterList-R-Code.html # Slope% 20Chart ), как я реплицировал данные с сайта, но я изо всех сил пытался внести какие-либо изменения, чтобы это выглядело как прикрепленное изображение.

Я был бы очень признателен, если бы кто-то мог посоветовать, иду ли я по правильным линиям, или прикрепленную мною диаграмму можно создать с помощью пакета в R, поскольку я не встречал и не видел этот визуал ранее. Буду признателен за любую поддержку, которую я могу получить.

chart that I am trying to replicate

Код, который я создал (все данные http://r -statistics.co / )

library(ggplot2)
library(scales)
theme_set(theme_classic())

# prep data
df <- read.csv("https://raw.githubusercontent.com/selva86/datasets/master/gdppercap.csv")
colnames(df) <- c("continent", "1952", "1957")
left_label <- paste(df$continent, round(df$`1952`),sep=", ")
right_label <- paste(df$continent, round(df$`1957`),sep=", ")
df$class <- ifelse((df$`1957` - df$`1952`) < 0, "red", "green")

# Plot
p <- ggplot(df) + geom_segment(aes(x=1, xend=2, y=`1952`, yend=`1957`, col=class), size=.75, show.legend=F) + 
                  geom_vline(xintercept=1, linetype="dashed", size=.1) + 
                  geom_vline(xintercept=2, linetype="dashed", size=.1) +
                  scale_color_manual(labels = c("Up", "Down"), 
                                     values = c("green"="#00ba38", "red"="#f8766d")) +  # color of lines
                  labs(x="", y="Mean GdpPerCap") +  # Axis labels
                  xlim(.5, 2.5) + ylim(0,(1.1*(max(df$`1952`, df$`1957`))))  # X and Y axis limits

# Add texts
p <- p + geom_text(label=left_label, y=df$`1952`, x=rep(1, NROW(df)), hjust=1.1, size=3.5)
p <- p + geom_text(label=right_label, y=df$`1957`, x=rep(2, NROW(df)), hjust=-0.1, size=3.5)
p <- p + geom_text(label="Time 1", x=1, y=1.1*(max(df$`1952`, df$`1957`)), hjust=1.2, size=5)  # title
p <- p + geom_text(label="Time 2", x=2, y=1.1*(max(df$`1952`, df$`1957`)), hjust=-0.1, size=5)  # title

# Minify theme
p + theme(panel.background = element_blank(), 
           panel.grid = element_blank(),
           axis.ticks = element_blank(),
           axis.text.x = element_blank(),
           panel.border = element_blank(),
           plot.margin = unit(c(1,2,1,2), "cm"))

Результат:

Slope Chart

1 Ответ

0 голосов
/ 09 июля 2019

Лучший способ сделать это - использовать geom_polygon на предварительно построенном фрейме данных с кумулятивными суммами ВВП в каждый момент времени:

zero_row <- tibble(continent = "0start",  # creates a row of 0's
                   year = c("1952", "1957"),
                   class  ="none",
                   gdp = 0)


df2 <- df %>% 
  gather("year", "gdp", 2:3) %>%  # separate years to new rows
  bind_rows(zero_row, .) %>% 
  group_by(year) %>% 
  mutate(y2 = cumsum(gdp)) %>%  # cumulative sum to give top y values
  arrange(continent, year)

df2[3:12, "y1"] <- df2[1:10, "y2"]  # insert bottom y values

order_df <- tibble(year = c("1952", "1952", "1957", "1957"),
                   level = c("y1", "y2", "y2", "y1"), 
                   order = 1:4)  # order to plot


p <- df2[3:12,] %>% 
  gather("level", "y", 5:6) %>%  # separate y values to new rows
  full_join(order_df, by = c("year", "level")) %>% 
  arrange(continent, order) %>% 
  ggplot() + 
  geom_polygon(aes(year, y, fill = continent, group = continent)) +
  geom_vline(xintercept=1, linetype="dashed", size=.1) +
  geom_vline(xintercept=2, linetype="dashed", size=.1) +
  labs(x="", y="Mean GdpPerCap") +
  scale_y_continuous(limits = c(0, 1.2*max(df2$y2)), expand = c(0 ,0))

lab_pos <- df2 %>%  # new label positions
  filter(continent !="0start") %>% 
  select(continent, year, y2) %>% 
  spread(year, y2)

# Add texts
p <- p + geom_text(data = df, label=left_label, y = lab_pos$`1952`, x=rep(1, NROW(df)), hjust=1.1, size=3.5)
p <- p + geom_text(data = df, label=right_label, y=lab_pos$`1957`, x=rep(2, NROW(df)), hjust=-0.1, size=3.5)
p <- p + geom_text(label="Time 1", x=1, y=1.1*(max(df2$`y2`)), hjust=1.2, size=5)  # title
p <- p + geom_text(label="Time 2", x=2, y=1.1*(max(df2$`y2`)), hjust=-0.1, size=5)  # title

# Minify theme
p + theme(panel.background = element_blank(), 
          panel.grid = element_blank(),
          axis.ticks = element_blank(),
          axis.text.x = element_blank(),
          panel.border = element_blank(),
          plot.margin = unit(c(1,2,1,2), "cm"),
          legend.position = "none")

Это дает следующий график: enter image description here

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Упс, забыл, что функция geom_area тоже существует.Попробуйте начать:

df2 <- df %>% 
  gather("year", "val", 2:3) 


df2 %>% 
  mutate(year = as.numeric(year),
         continent = factor(df2$continent, levels = rev(unique(df2$continent)))) %>% 
  ggplot() +
  geom_area(aes(x = year, y = val, fill = continent)) +
  scale_x_continuous(breaks = c(1952, 1957), expand = c(0.5,0.5))

(в этом случае year необходимо преобразовать в числовое значение, поэтому отображение остальных ваших меток и т. Д. Необходимо будет изменить.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...