Timelime в r с ggplot без определения начальных и конечных значений - PullRequest
2 голосов
/ 30 января 2020

Мне нужна помощь в создании скрипта для графа. Информация ниже:

У меня есть эти вымышленные данные

table <- data.frame(ind = c("Ind1","Ind1","Ind1","Ind1","Ind1","Ind1","Ind2",
                      "Ind2","Ind2","Ind3","Ind3","Ind3","Ind3","Ind4",
                      "Ind4","Ind4","Ind5","Ind5","Ind5","Ind5","Ind5",
                      "Ind5"),

           photo = c("55", "62", "63", "65", "70", "97", "100", "105",
                    "109", "72", "74", "76", "101", "140", "150", "170",
                    "168", "172", "182", "185", "189", "194"),


           data = c("jan/17", "mar/17", "mar/17", "apr/17",
                     "jun/17", "oct/17", "dec/17", "apr/18",
                     "may/18", "aug/17", "sep/17", "sep/17",
                     "dec/17", "aug/18", "nov/18", "feb/19",
                     "jan/19", "feb/19", "mar/19", "mar/19",
                     "mar/19", "jul/19")) 

, и я хотел бы создать такую ​​диаграмму с именами людей и датой встречи. Я хотел, чтобы размер символов соответствовал количеству фотографий, существующих в этом месяце, и количеству фотографий над символом (, например, ).

Все, что я нашел в inte rnet использует фрейм данных с двумя столбцами (начальный x и конечный x), т.е. здесь . Мне действительно нужно разделить на столбцы? А как поступить с промежуточными значениями ??

1 Ответ

0 голосов
/ 30 января 2020

Вы можете закодировать данные за месяц / год, используя as.yearmon из пакета zoo.

Для подсчета количества фотографий в месяц group_by и summarise.

Чтобы нарисовать отрезки линии, создайте вторую таблицу данных для указания минимальной и максимальной дат.

library(zoo)
library(ggplot2)
library(dplyr)

my_table$ind <- factor(my_table$ind)
my_table$mo_yr <- as.yearmon(my_table$data, "%b/%y")

my_table_sum <- my_table %>%
  group_by(mo_yr, ind) %>%
  summarise(count = n())

my_table_range <- my_table_sum %>%
  group_by(ind) %>%
  summarise(min = min(mo_yr),
            max = max(mo_yr))

ggplot(data = my_table_sum, aes(x = mo_yr, y = ind)) +
  scale_x_yearmon() +
  geom_point(aes(size = count)) +
  geom_text(aes(label = ifelse(count > 1, as.character(count), '')), vjust = -1) +
  scale_size_continuous(range = c(1, 3), breaks = c(1,2,3)) +
  geom_segment(data = my_table_range, aes(x = min, xend = max, y = ind, yend = ind)) +
  theme(axis.title.x=element_blank(), axis.title.y=element_blank(), legend.position="none")

timeline plot

Редактировать : Для большей гибкости в метках и метках оси X вы можете использовать scale_x_date вместо scale_x_yearmon (пакет zoo не понадобится).

scale_x_date позволит указывать разрывы (каждые 3 месяца) и то, что вы хотите на этикетке (прямо сейчас месяц и 4 ди git год, например, март 2019).

Вместо преобразования вашего data в yearmon (месяц / год) мы можем просто использовать Date (используя 1-й день месяца при конвертации).

Также добавлено небольшое поле вокруг участка.

#library(zoo)
library(ggplot2)
library(dplyr)

my_table$ind <- factor(my_table$ind)
#my_table$mo_yr <- as.yearmon(my_table$data, "%b/%y")
my_table$dates <- as.Date(paste0("1/", my_table$data), format = "%d/%b/%y")

my_table_sum <- my_table %>%
  group_by(dates, ind) %>%
  summarise(count = n())

my_table_range <- my_table_sum %>%
  group_by(ind) %>%
  summarise(min = min(dates),
            max = max(dates))

ggplot(data = my_table_sum, aes(x = dates, y = ind)) +
  scale_x_date(date_breaks = "3 months", date_labels = "%b %Y") +
  geom_point(aes(size = count)) +
  geom_text(aes(label = ifelse(count > 1, as.character(count), '')), vjust = -1) +
  scale_size_continuous(range = c(1, 3), breaks = c(1,2,3)) +
  geom_segment(data = my_table_range, aes(x = min, xend = max, y = ind, yend = ind)) +
  theme(axis.title.x=element_blank(), axis.title.y=element_blank(), legend.position="none",
        plot.margin=unit(c(1,1,1,1),"cm"))

plot with ticks and labels every 3 months

...