вторая ось Y с другой шкалой - PullRequest
0 голосов
/ 09 мая 2018

Я создал диаграмму с ggplot2 geom_bar и хочу иметь две метрики в столбцах. Я использовал melt, чтобы сделать это. Однако теперь мне нужна вторая ось Y с другим масштабом, потому что числа двух метрик слишком разные.

В следующем кадре данных и код, который я использовал:

df <- data.frame(categories = c("politics", "local", "economy", "cultural events", 
                                "politics", "local", "economy", "cultural events"), 
               metric = c("page", "page", "page", "page", 
                          "product", "product", "product", "product"), 
               value = c(100L, 50L, 20L, 19L, 
                         950000L, 470000L, 50000L, 1320L))

В следующем коде я использовал для создания графика и второй оси Y:

x <- ggplot(df, aes(x=categories, y=value, fill = metric))
x + geom_bar(stat = "identity", position = "dodge") +
  scale_y_continuous(sec.axis=sec_axis(~. *1000), limits=c(1,1000))

Однако теперь на графике больше нет баров ... Кто-нибудь знает, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Другим подходом может быть использование highcharter

library(dplyr)
library(tidyr)
library(highcharter)

#convert your data in wide format
df <- df %>% spread(metric, value)

#plot
highchart() %>% 
  hc_xAxis(categories = df$categories) %>%
  hc_yAxis_multiples(
    list(lineWidth = 3, title = list(text = "Page")),
    list(opposite = TRUE, title = list(text = "Product"))
  ) %>% 
  hc_add_series(type = "column", data = df$page) %>% 
  hc_add_series(type = "line", data = df$product, yAxis=1) # replace "line" with "column" to have it in bar format

Выходной участок:

enter image description here

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

df <- structure(list(categories = structure(c(4L, 3L, 2L, 1L, 4L, 3L, 
2L, 1L), .Label = c("cultural events", "economy", "local", "politics"
), class = "factor"), metric = structure(c(1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L), .Label = c("page", "product"), class = "factor"), 
    value = c(100L, 50L, 20L, 19L, 950000L, 470000L, 50000L, 
    1320L)), .Names = c("categories", "metric", "value"), row.names = c(NA, 
-8L), class = "data.frame")
0 голосов
/ 09 мая 2018

Вместо отображения разных баров на одном графике вы можете сложить их вместе (или огранить):

Как уже упоминалось в комментариях @ConorNeilson, вам не нужно (и не следует) указывать переменные с помощью df$. ggplot знает, чтобы искать их в указанном data.frame df. ​​
Аргумент free_y в facet_grid -call позволяет отображать различные шкалы на осях Y.

library(ggplot2)
ggplot(df, aes(x = categories, y = value, fill = metric)) + 
  geom_bar(stat = "identity", position = "dodge") +
  facet_grid(metric~., scales = "free_y")

enter image description here

Вы можете сравнить различные значения в log10 -размер:

ggplot(df, aes(x = categories, y = value, fill = metric)) + 
  geom_bar(stat = "identity", position = "dodge") +
  scale_y_log10(name = "value (log10 scale)", 
                breaks = 10^(0:10), labels = paste0(10, "^", 0:10))

enter image description here

...