ggplot два цвета geom_point с альфа - PullRequest
0 голосов
/ 02 августа 2020

Здравствуйте, я пытаюсь наложить на ggplot значения разных измерений, выполненных в одних и тех же координатах. Измерения имеют координаты X и Y и значения интенсивности для различных условий. Я хотел бы, чтобы значения интенсивности были нанесены разными цветами и оба были видны с помощью альфа-канала. Я пробовал разные комбинации аргументов альфа / цвета и заливки, но не могу найти подходящего. Любая помощь будет оценена

library(ggplot2)
library(reshape2)

#sample data
data <- data.frame(coordX = c(5, 10, 15, 20), coordY = c(5, 10, 20, 30), var1 = c(0.0, 0.02, 0.02, 0.02), var2 = c(0.34, 0.26, 0.31, 0.28))

library(reshape2)

#my best attempt so far
ggplot(data = melt(data, id.vars = c("coordX", "coordY"), value.name = "pixel.intensity"), aes(x = coordX, y = coordY)) + geom_point(aes(color= variable, fill = pixel.intensity, alpha =0.5))

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Это помогает?

#sample data
data <- data.frame(coordX = c(5, 10, 15, 20), coordY = c(5, 10, 20, 30), var1 = c(0.0, 0.02, 0.02, 0.02), var2 = c(0.34, 0.26, 0.31, 0.28))

library(reshape2)
data2 = melt(data, id.vars = c("coordX", "coordY"), value.name = "pixel.intensity")

ggplot(data2,
       aes(x = jitter(coordX), y = jitter(coordY), 
           alpha = pixel.intensity, color = variable, fill= variable)) + 
  geom_point() +
  theme_bw()

Я вытащил расплав из кода, чтобы было легче просматривать данные, и я немного переместил переменные, чтобы вы могли видеть оба.

0 голосов
/ 03 августа 2020

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

Это вроде как работает, но не так хорошо, как вы могли бы надеяться, по ряду причин.

Начнем с того, что предоставленные вами данные слишком несбалансированы в пользу второй группы, поэтому баллы в основном будут все просто кажутся синими. Поэтому нам нужны разные значения переменной pixel.intensity, чтобы показать, что эффект действительно работает:

library(ggplot2)

df <- structure(list(coordX = c(5, 10, 15, 20, 5, 10, 15, 20), coordY = c(5, 
10, 20, 30, 5, 10, 20, 30), variable = structure(c(1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L), .Label = c("var1", "var2"), class = "factor"), 
    pixel.intensity = c(0, 0.42, 0.51, 0.02, 0.34, 0.1, 0.15, 
    0.28)), row.names = c(NA, -8L), class = "data.frame")


ggplot(df, aes(x = coordX, y = coordY)) + 
  geom_point(aes(alpha = pixel.intensity, color = variable), size = 5) +
  scale_alpha_identity()

You can see you need a substantial difference in alpha for the points to have anything other than a gray, washed out tinge. Also, if both alphas are low, the points will be very faint.


EDIT

From comments by the OP, it is apparent that we are actually talking about mixing RGB colors here. In that case, suppose we had the following data frame, with red, blue and green intensities scaled between 0 and 1:

red   <- rep(c(seq(0, 1, 0.1), rep(1, 10)), 21)
green <- rep(c(rep(1, 10), seq(1, 0, -0.1)), 21)
blue  <- rev(rep(c(seq(0, 1, 0.1), rep(1, 10)), each = 21))
red   <- red * rev(blue)
green <- green * rev(blue)

x <- rep(0:20, 21)
y <- rep(0:20, each = 21)

df <- data.frame(x, y, red, blue, green)

Затем мы можем построить значения rgb, просто сделав это ;

df$rgb <- rgb(red, green, blue)

ggplot(df, aes(x, y, color = rgb)) + geom_point(size = 5) + scale_color_identity()

enter image description here

Or if you want to actually emulate pixels:

ggplot(df, aes(x, y, fill = rgb)) + geom_tile() + scale_fill_identity()

enter image description here Created on 2020-08-02 by the пакет REPEX (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...