Двойная гистограмма оси X (вверху и внизу графика), показывающая распределение температуры для двух разных городов - PullRequest
1 голос
/ 05 июня 2019

Я пытаюсь создать один сюжет с двумя осями X.Мне нужны две гистограммы на этом одном графике: одна сверху для города А (вверх ногами), а другая снизу для города Б. Я хочу, чтобы оси X показывали температуру в градусах.

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

city<-c(A, B, A, B, A, B)
temp<-c(20, 25, 30, 35, 30, 40)
data<-data.frame(city, temp)

g.top <- ggplot(data, aes(x = temp)) +
  theme_bw() +
  theme(plot.margin = unit(c(1,5,-30,6),units="points"),
        axis.title.y = element_text(vjust =0.25)) +
  geom_histogram()
g.bottom <- ggplot(data, aes(x = temp)) +
  theme_bw() +
  theme(plot.margin = unit(c(0,5,1,1),units="points")) +
  geom_histogram()
grid.arrange(g.top,g.bottom, heights = c(1/5, 4/5))


p <- ggplot(data, aes(x = temp, y=city)) + geom_histogram(aes(y=variable))

Когда я запускаю первый блок кода, он дает мне две отдельные гистограммы и говорит:

stat_bin() using bins = 30. Pick better value with binwidth.

но в любом случае это не дает мне вторую ось x.

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

Я очень обескуражен и очень, очень признателен за любой совет

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

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

# Get the counts
library(tidyverse)
my_data_transform <- data %>%
  count(temp, city, name = "count")

# Take that, and append after it rows that measure the "space between" each city's counts at each temperature.
my_data_transform2 <- bind_rows(
  my_data_transform,
  my_data_transform %>% 
    count(temp, wt = count, name = "count") %>%
    mutate(city = " ",
           count = 15 - count)  # Adjust to taste
  ) %>%
  # For plotting, I want the "space between" rows to be plotted in between the two cities.
  #  This is accomplished by making the city an ordered factor and putting the blanks 2nd.
  mutate(city = city %>% fct_relevel(" ", after = 1))

# Plot as geom_col, specifying clear bars for the middle ones.
ggplot(my_data_transform2, aes(temp, count, fill = city)) +
  geom_col() +
  scale_fill_manual(values = c("black", NA, "black")) +
  scale_y_continuous(labels = NULL, name = "") +
  theme_minimal()

enter image description here

1 голос
/ 06 июня 2019

Составьте гистограммы отдельно, по одной для каждого города:

  1. Верх с перевернутой осью Y и метками по оси X наверху.
  2. Внизу, как обычно, сюжет
  3. Устанавливаем одинаковые ограничения по оси X для обоих графиков, чтобы при выравнивании по оси X по вертикали с использованием cowplot: plotgrid Ось X будет выравниваться.

См. Пример ниже:

library(ggplot2)
library(cowplot)

#bigger example data
set.seed(1); data <- data.frame(city = sample(LETTERS[1:2], 100, replace = TRUE), 
                                temp = sample(1:50, 100, replace = TRUE))

g.top <- ggplot(data[ data$city == "A", ], aes(x = temp)) +
  geom_histogram() +
  scale_x_continuous(limits = c(10, 50), position = "top") +
  scale_y_reverse() +
  theme_minimal() 

g.bottom <- ggplot(data[ data$city == "B", ], aes(x = temp)) +
  geom_histogram() +
  scale_x_continuous(limits = c(10, 50)) +
  theme_minimal()


plot_grid(g.top, g.bottom, 
          labels = c("City A", "City B"), nrow = 2, align = 'hv')

enter image description here

...