Можно ли здесь использовать огранку ggplot?

Добро пожаловать в Тидивилль.

Ниже приведен небольшой график, показывающий население городов в Тидивилле. Некоторые города принадлежат государству А, а некоторые - государству В.

Я хочу выделить города, население которых сократилось, красным цветом. Миссия выполнена до сих пор.

Но в Тидивилле много штатов. Есть ли способ использовать огранку огранки ggplot, чтобы показать график для каждого состояния. Я не уверен, потому что я новичок, и я делаю небольшой расчет за пределами вызова ggplot, чтобы определить города, в которых сократилось население.

library(ggplot2)
library(tibble)

t1 <- tibble (
  y2001 = c(3, 4, 5, 6, 7, 8, 9, 10),
  y2016 = c(6, 3, 9, 2, 8, 2, 11, 15),
  type = c("A", "A", "B", "B", "A", "A", "B", "B")
)

years <-  15
y2001 <- t1$y2001
y2016 <- t1$y2016

# Places where 2016 pop'n < 2001 pop'n
yd <- y2016 < y2001

decrease <- tibble (
  y2001 = t1$y2001[yd],
  y2016 = t1$y2016[yd]
)

# Places where 2016 pop'n >= 2001 pop'n
yi <- !yd

increase <- tibble (
  y2001 = t1$y2001[yi],
  y2016 = t1$y2016[yi]
)

ggplot() + 
  # Decreasing
  geom_segment(data = decrease, aes(x = 0, xend = years, y = y2001, yend = y2016), 
             color = "red") +

  # Increasing or equal
  geom_segment(data = increase, aes(x = 0, xend = years, y = y2001, yend = y2016), 
             color = "black") 

4 ответа

Решение

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

t1 <- tibble (
  y2001 = c(3, 4, 5, 6, 7, 8, 9, 10),
  y2016 = c(6, 3, 9, 2, 8, 2, 11, 15),
  type = c("A", "A", "B", "B", "A", "A", "B", "B")
)
years <- 15

Но вместо того, чтобы делать все разделение и поднабор, мы просто создадим фиктивную переменную для того, y2016 > y2001,

t1$incr <- as.factor(ifelse(t1$y2016 >= t1$y2001, 1, 0))

Затем мы можем извлечь аргумент данных в ggplot() позвоните, чтобы сделать его более эффективным. Мы будем использовать только один geom_segment() аргумент и установить color() аргумент, чтобы быть той фиктивной переменной, которую мы создали ранее. Затем нам нужно передать вектор цветов scale_fill_manual()"s value аргумент. Наконец, добавьте facet_grid() аргумент. Если вы используете только одну переменную, вы ставите точку на противоположной стороне тильды. Первый период означает, что они будут обшиты панелями бок о бок, последний период означает, что они будут наложены друг на друга

ggplot(data = t1) +
  geom_segment(aes(x = 0, xend = years, y = y2001, yend = y2016, color=incr)) +
  scale_fill_manual(values=c("black", "red")) +
  facet_grid(type~.)

Я думаю, что было бы намного проще, если бы вы просто поместили свои данные в аккуратный формат, как ожидает ggplot2. Вот возможное решение с использованием функций Tidyverse

library(tidyverse)
t1 %>% 
  rowid_to_column("city") %>% 
  mutate(change=if_else(y2016 < y2001, "decrease", "increase")) %>% 
  gather(year, pop, y2001:y2016) %>%
  ggplot() + 
    geom_line(aes(year, pop, color=change, group=city)) +
    facet_wrap(~type) + 
    scale_color_manual(values=c("red","black"))

Это приводит к

Я считаю, что вам не нужно создавать два новых набора данных, вы можете добавить столбец к t1,

t2 <- t1
t2$decr <- factor(yd + 0L, labels = c("increase", "decrease"))

Я оставил оригинал t1 целая и измененная копия, t2,
Теперь для того, чтобы подать заявку ggplot граней, может быть, это то, что вы ищете.

ggplot() + 
  geom_segment(data = t2, aes(x = 0, xend = years, y = y2001, yend = y2016), color = "red") +
  facet_wrap(~ decr)

Если вы хотите изменить цвета, используйте новый столбец decr в качестве значения дляcolor, Обратите внимание, что этот аргумент меняет свою позицию, теперь он aes(..., color = decr),

ggplot() + 
  geom_segment(data = t2, aes(x = 0, xend = years, y = y2001, yend = y2016, color = decr)) +
  facet_wrap(~ decr)
require(dplyr)
t1<-mutate(t1,decrease=y2016<y2001)
ggplot(t1)+facet_wrap(~type)+geom_segment(aes(x = 0, xend = years, y = y2001, yend = y2016, colour=decrease))
Другие вопросы по тегам