2017-02-11 16 views
1

Я делаю сюжет с использованием geom_tile, где я хотел бы указать прозрачность каждой плитки на основе переменной. Однако, когда я указываю альфу с aes(), она применяется только для заполнения, а не для цвета. Это приводит к тому, что линии между плитами более темные, чем плитки. Есть ли способ указать альфу для цвета? Использование geom_raster для меня не является вариантом, так как это для карты, и я хотел бы использовать проекцию координат. Удаление спецификации цвета заставляет изображение выглядеть размытым.Как указать альфу для заполнения и цвета geom_tile

Вот код, который воспроизводит мою проблему.

library(ggplot2) 
library(scales) 
library(reshape) 

volcano3d <- melt(volcano) 
names(volcano3d) <- c("x", "y", "z") 
ggplot(volcano3d, aes(x, y, z = z,fill=z,color=z)) + 
    geom_tile(aes(alpha=y))+ 
    theme_bw() 
+0

Похоже, вы должны быть в состоянии сделать это с чем-то вроде 'scale_color_gradient (Low = '# 00000000', высокий = 'Hotpink')', но, к сожалению, игнорирует (хотя он принимает его ...) - может быть, проблема с цветовым пространством. – alistaire

+0

Вы бы так подумали, но я также обнаружил, что нет эффекта указания альфы в scale_color_gradient(). Кажется, что для цвета и заливки должна быть отдельная альфа. – pthomp

+0

Alpha - это его собственная эстетика, поэтому «scale_alpha_continuous» существует. Но да, для 'geom_tile', это влияет только на заполнение, а не на удар.Подход «scale_color_gradient» немного взломан, но похоже, что он терпит неудачу из-за базовой обработки цвета. Возможно, проблема GitHub может быть здесь, если она правильно собрана, хотя она может быть отклонена как слишком большая работа. – alistaire

ответ

2

Как @alistaire, мне казалось, что geom_tile плитка границы должна подчиняться alpha отображения, но они не кажутся. В качестве обходного пути вы можете использовать geom_segment для рисования сегментов линии в тех же местах, где должны быть границы. Эти сегменты подчиняются картированию alpha.

В приведенном ниже коде мы сначала создаем новый фрейм данных segs для рисования сегментов. Мы могли бы использовать исходные данные, но это короткие строки и один столбец.

library(dplyr) 

segs = expand.grid(x=(min(volcano3d$x)-1):max(volcano3d$x), 
        y=(min(volcano3d$y)-1):max(volcano3d$y)) %>% 
    left_join(volcano3d) 

Чтобы добавить сегменты к сюжету, нам нужно сортировать каждый раз, чтобы получить й и у значения в правильном порядке для, соответственно, вертикальных или горизонтальных сегментов. Мы также используем colour="#FFFFFF00" в geom_tile, чтобы удалить границу плитки по умолчанию.

ggplot(volcano3d, aes(fill=z, colour=z, alpha=y)) + 
    geom_tile(colour="#FFFFFF00", aes(x, y)) + 
    geom_segment(data=segs %>% arrange(x,y), 
       aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5), size=0.2) + 
    geom_segment(data=segs %>% arrange(y,x), 
       aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5), size=0.2) 

На приведенном ниже рисунке вы можете увидеть границы плитки, но они исчезают вместе с плитами. Границы немного темнее, потому что они нарисованы поверх плиток, что приводит к примерно удвоенной непрозрачности плиток.

enter image description here

Если вы хотите, чтобы плитка границы менее заметным, вы можете свернуть их alpha значения относительно плитки значений альфа.

ggplot(volcano3d, aes(fill=z, colour=z)) + 
    geom_tile(colour="#FFFFFF00", aes(x, y, alpha=y)) + 
    geom_segment(data=segs %>% arrange(x,y), 
       aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5, alpha=0.2*y), size=0.2) + 
    geom_segment(data=segs %>% arrange(y,x), 
       aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5, alpha=0.2*y), size=0.2) 

enter image description here

Чтобы убедиться в том, что сегменты имитируя плитку цвета и альфа-значение, вы можете удалить плитки и сюжетные толстые линии:

ggplot(volcano3d, aes(fill=z, colour=z, alpha=y)) + 
    #geom_tile(colour="#FFFFFF00", aes(x, y)) + 
    geom_segment(data=segs %>% arrange(x,y), 
       aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5), size=1.5) + 
    geom_segment(data=segs %>% arrange(y,x), 
       aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5), size=1.5) 

enter image description here

Вот версия с расходящимся градиентом цвета, что создает большую контрастность в диапазоне z значения:

ggplot(volcano3d, aes(fill=z, colour=z, alpha=y)) + 
    geom_tile(colour="#FFFFFF00", aes(x, y)) + 
    geom_segment(data=segs %>% arrange(x,y), 
       aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5), size=0.2) + 
    geom_segment(data=segs %>% arrange(y,x), 
       aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5), size=0.2) + 
    scale_fill_gradient2(low="red", mid="yellow", high="blue", midpoint=mean(range(volcano3d$z))) + 
    scale_colour_gradient2(low="red", mid="yellow", high="blue", midpoint=mean(range(volcano3d$z))) 

enter image description here