Это расширение этого вопроса. В настоящее время я использую самую последнюю версию ggplot2
(v2.2.0) из CRAN для создания графиков в R
.
Я использую решение, предоставленное @Axeman здесь.
Проблема в том, что когда я использую грани, иногда одна из осей y показывает очень маленькие значения. Мне интересно, есть ли у кого-то чистое решение, так что обе оси Y можно масштабировать соответствующим образом.
Воспроизводимый пример:
library(data.table)
library(ggplot2)
library(scales)
dt1 <- data.table(diamonds)
dt1 <- dt1[, .(averageprice = mean(price), numstones =.N, Group = "Trend"),
by = color]
dt2 <- data.table(diamonds)
dt2 <- dt2[cut == "Premium", .(averageprice = mean(price), numstones = .N, Group = "Premium"),
by = color]
dt1 <- rbindlist(list(dt1, dt2))
setkey(dt1, color)
# rescale axes for plotting
max_left <- max(dt1[, sum(averageprice), by = .(Group, color)]$V1)
max_right <- max(dt1[, sum(numstones), by = .(Group, color)]$V1)
dt1$right <- dt1$numstones / (max_right / max_left)
dt1
# color averageprice numstones Group right
# D 3169.954 6775 Trend 3776.6435
# D 3631.293 1603 Premium 893.5734
# E 3076.752 9797 Trend 5461.2216
# E 3538.914 2337 Premium 1302.7330
# F 3724.886 9542 Trend 5319.0748
# F 4324.890 2331 Premium 1299.3883
# G 3999.136 11292 Trend 6294.5916
# G 4500.742 2924 Premium 1629.9491
# H 4486.669 8304 Trend 4628.9664
# H 5216.707 2360 Premium 1315.5540
# I 5091.875 5422 Trend 3022.4296
# I 5946.181 1428 Premium 796.0217
# J 5323.818 2808 Trend 1565.2863
# J 6294.592 808 Premium 450.4100
p <- ggplot()
p <- p + geom_col(data = dt1, aes(color, averageprice, fill = "myfill"))
p <- p + geom_point(data = dt1, aes(color, right, colour = "mycolour"))
p <- p + scale_y_continuous(sec.axis = sec_axis(trans = ~ . * (max_right / max_left),
name = 'number of stones'))
p <- p + scale_fill_manual(name = "", labels = "Average Price", values = "#00AEFF")
p <- p + scale_colour_manual(name = "", labels = "Number of Stones", values = "#3c3c3c")
p <- p + guides(fill = guide_legend(order = 1))
p <- p + facet_wrap(~ Group, scales = "free_y")
p <- p + theme(legend.position = "bottom")
p
То, что я надеюсь сделать, - это иметь так, чтобы правая ось фасета Premium имела максимальное значение, которое больше соответствует данным (приблизительно 4000). Очевидно, не желая делать жесткие коды.
Всем приветствуется любое руководство.