R - сделать диаграмму рассеяния похожей на точечную диаграмму со значениями выше и ниже нуля - PullRequest
0 голосов
/ 06 июля 2018

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

Пример данных

В настоящее время у меня есть диаграмма рассеяния, которая выглядит следующим образом

enter image description here

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

Example

В основном то, что больше похоже на точечный график, но имеет значения выше и ниже линии. Диаграмма рассеяния кажется неуместной, но я не вижу, как создать точечную диаграмму, которая будет показывать моих победителей выше линии, а моих проигравших ниже линии, чтобы нулевая линия оставалась неизменной. Вот код, который я использую для диаграммы рассеяния:

sp1 <- ggplot(store_change_ranked, aes(x=date, y=rank)) +
        geom_point(aes(color = cut(share_chg_yag, c(-Inf, -.1, -.05, -.025, -.015, 0, .015, .025, .05, .1, Inf)))) +
        scale_color_manual(name = "Share Change",
                           values = c("(-Inf,-0.1]" = "red4",
                                      "(-0.1,-0.05]" = "red",
                                      "(-0.05,-0.025]" = "orangered",
                                      "(-0.025,-0.015]" = "darkorange2",
                                      "(-0.015,0]" = "darkorange",
                                      "(0,0.015]" = "greenyellow",
                                      "(0.015,0.025]" = "lightgreen",
                                      "(0.025,0.05]" = "green",
                                      "(0.05,0.1]" = "green2",
                                      "(0.1, Inf]" = "green4"),
                           labels = c("< -10%", " ", "-2.5% to -5.0% ", " ", "0 to -1.5%", "0 to 1.5%", " ", "2.5% to 5.0% ", " ", "10% +")) +
        labs(x = "4-Week Period", title = "Count of Stores Gaining/Losing Share",
             subtitle = "For the 13 periods ending June 2018", y = "# Stores")+
        scale_x_date(date_breaks = "1 month", date_labels = "%m-%y")+
        theme(legend.position = "right", axis.text.y = element_blank(),panel.background=element_blank(),
              panel.grid.major=element_blank(),
              panel.grid.minor=element_blank())

Буду признателен за любую помощь.

Спасибо!

1 Ответ

0 голосов
/ 09 октября 2018

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

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

Вот сюжет, который я придумал: enter image description here

И вот код для этого:

# **************************************************************************** #
# Simulate Data                                                             ---- 
# **************************************************************************** #

set.seed(123)

create_data <- function(year, month, sector.rising, 
                        max.percent, max.number.sectors) {

  reps <- sum(max.number.sectors, 1)

  if(sector.rising == 1){
    multiplier <- 1
  } else multiplier <- -1

  tmp <- data.frame(
    Year.Month = factor(rep(paste0(year,",", month),reps)),
    Sector = rep(sector.rising,reps),
    Sector.Count = multiplier*seq(0, max.number.sectors),
    Percent = multiplier*sort(runif(reps,min =0, max = max.percent))
  )

  return(tmp)
}


df.tmp <- NULL

for (k.sector in 1:2){

  for (i.year in 2006:2016){
    for (j.month in 1:12) {

      if (k.sector == 1) { # 1 for rising, 2 for falling
        ran.percent <- runif(1,0,1)
      } else ran.percent <- runif(1,0,1.25)

      ran.number.sectors <- rbinom(1, 20, 0.5)

      tmp <- create_data(year = i.year,
                         month = j.month,
                         sector.rising = k.sector, 
                         max.percent = ran.percent,
                         max.number.sectors = ran.number.sectors
      )

      df.tmp <- rbind(df.tmp, tmp)

    }
  }

}

# **************************************************************************** #
# Plot                                                                      ---- 
# **************************************************************************** #

p <- ggplot(
      data = df.tmp,
      aes(x=Year.Month,
          y=Sector.Count, 
          color = cut(Percent, breaks = seq(-1.25,1,.25),include.lowest = T)
      )
    ) + 
    geom_point(
      size=2,
      alpha = 1,
      pch = 19
    ) +
    scale_x_discrete(
      position = "top",
      breaks = c("2007,1","2008,1","2009,1","2010,1","2011,1",
                 "2012,1","2013,1","2014,1","2015,1"
      ),
      labels = c("2007","2008","2009","2010","2011",
                 "2012","2013","2014","2015"
      ),
      name = ""
      ) +
    scale_y_continuous(
      limits = c(-20,20),
      breaks = seq(-20,20,5),
      labels = as.character(seq(-20,20,5)),
      name = "< SECTORS FALLING       SECTORS RISING >",
      expand = c(0,0)
      ) + 
    scale_color_manual(
      values = c("#d53e4f","#f46d43","#fdae61","#fee08b",
                 "#ffffbf","#e6f598","#abdda4","#66c2a5","#3288bd"),
      name = "", 
      drop = FALSE,
      labels = c("     ",
                 "-1%   ",
                 "     ",
                 "     ",
                 "     ",
                 "0%   ",
                 "     ",
                 "     ",
                 ".75% "),
      guide = guide_legend(
        direction = "horizontal",
        keyheight = unit(2, units = "mm"),
        keywidth = unit(2, units = "mm"),
        nrow = 1,
        byrow = T,
        reverse = F,
        label.position = "bottom",
        override.aes=list(shape=15, cex = 7),
        label.hjust = -0.4,
        title.hjust = 0.5
      )
    ) +
    theme(
      text = element_text(size = 10, color = "#4e4d47"),
      panel.background = element_blank(),
      legend.key.size = unit(1,"mm"),
      legend.position = "top",
      axis.title = element_text(size = 8, color = "#4e4d47"),
      legend.text = element_text(size = 6, color = "#4e4d47")
    )

p 
...