Переопределение автоматически назначаемых значений для градиентных цветовых шкал в ggplot

#r #ggplot2

#r #ggplot2

Вопрос:

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

Приведенный ниже пример демонстрирует, что точки в нижнем левом углу p1 находятся в диапазоне от ~ 50 до ~ 148 (от темно-зеленого до желтого). При вычислении среднего значения на графике stat_summary, p2, я хочу, чтобы оно заканчивалось как светло-зеленые шестиугольники, поскольку среднее значение должно быть ~ 100. Однако цветовая шкала смещается, делая нижний левый шестиугольник синим и пурпурным.

Как мне переопределить автоматическое назначение цветов? Я пытался установить ручные разрывы и значения, но поскольку я использую логарифмическую цветовую шкалу, сложно оценить точное значение разных цветов. Есть ли способ «скопировать вставить» цветовую шкалу и присвоенные значения с p1 на p2?

воспроизводимый пример:

 library(ggplot2)  
  
x = c(3, 1, 1, 1, 10, 1, 1, 1, 8, 1, 4, 21, 2, 3, 54, 1, 2, 1, 5, 254)
y = c(1.00, 1.00, 1.00, 1.00, 2.50, 1.00, 1.00, 1.00, 8.00, 1.00, 2.00, 4.20, 1.00, 1.00, 4.91, 1.00, 1.00, 1.00, 2.50, 42.33)
z = c(71, 265, 430, 110, 80, 87, 100, 174, 111, 102, 157, 118, 267, 133, 102, 435, 107, 72, 123, 115)

df2 <- data.frame(x,y,z)

p1 <- ggplot(df2, aes(x, y))  
  geom_point(aes(colour = z), size = 5)  
  scale_colour_gradientn(name = "z",colours = colorRampPalette(c("dark green", "green", "yellow", "orange", "red", "purple", "blue"))(100), trans = "log")

print(p1)

p2 <- ggplot(df2, aes(x, y, z = z))   
  stat_summary_hex()  
  scale_fill_gradientn(name = "z",colours = colorRampPalette(c("dark green", "green", "yellow", "orange", "red", "purple", "blue"))(100), trans = "log")

print(p2)
  

Комментарии:

1. Попробуйте добавить одинаковые ограничения для обеих шкал, например limits = c(50, 450)

2. Работает идеально @stefan tnx! 😀