Вставить цвет в градиент заливки масштаба в указанном месте / значении в ggplot2

#r #ggplot2 #fill

#r #ggplot2 #заливка

Вопрос:

Я создал график в ggplot2, а затем «поверх» этого графика, который я использовал geom_rect() для визуализации (красным цветом) точек данных с наименьшими 10% значений z . Я все равно хотел бы использовать scale_fill_gradientn для заполнения легенды / шкалы, но я хотел бы вставить красный цвет на минимальном уровне заливки (т. Е. В нижней части вертикальной шкалы). Как я могу использовать scale_fill_gradientn и сделать это? Или, как я могу достичь желаемого результата, используя другой метод?

 # The example code here produces an plot for illustrative purposes only.
# create data frame, from ggplot2 documentation
df <- expand.grid(x = 0:5, y = 0:5) 
df$z <- runif(nrow(df))
# select min. 10%
df.1 <- df[df$z <= quantile(df$z, 0.1),]

#plot
ggplot(df, aes(x, y, fill = z))   geom_raster()   
scale_fill_gradientn(colours=topo.colors(7),na.value = "transparent")  
geom_rect(data=df.1, size=1, fill="red", colour=NA , aes(xmin=x-.5, xmax=x .5, ymin=y-.5, ymax=y .5))
  

Ответ №1:

Одним из решений было бы указать "red" один из цветов scale_fill_gradientn() . Красный используется дважды, чтобы гарантировать, что в диапазоне от 0 до 0.1 все значения становятся «красными», а seq() все остальные значения в диапазоне от 0.1001 до 1 распределяются равномерно. В этом случае вам не нужен второй фрейм данных.

 set.seed(123)
df <- expand.grid(x = 0:5, y = 0:5) 
df$z <- runif(nrow(df))
ggplot(df, aes(x, y, fill = z))   geom_raster()   
      scale_fill_gradientn(colours=c("red","red",topo.colors(6)),
                 values=c(0,0.1,seq(0.1001,1,length.out=7)),na.value = "transparent")
  

введите описание изображения здесь

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

1. Есть ли способ сделать это с меньшим процентом, скажем, 1%? Например, кажется, что для отображения «красного» в масштабе должно быть не менее 5%? Могу ли я использовать минимум 1% и отображать красный цвет с помощью этой техники?

2. При использовании этой технологии цвета в легенде масштабируются в соответствии со значениями — поэтому, если вы используете 1%, красный цвет не будет виден, потому что он занимает 1/100 всей легенды.

3. Вы можете преобразовать свою непрерывную переменную z в коэффициент, чтобы получить нелинейный масштаб. Например (не тестировалось): используйте cut(z,c(0,0.1,seq(0,2,1,length.out= 6)), включите. наименьший = T), а затем использовать ‘scale_fill_manual (значения = c («красный», topo.colors (6))’