У меня есть следующий дф
library(Rlab)
q <- data.frame(v = seq(1,1000,1), w = round(rnorm(1000,500,200),2),
x = rbern(1000, 0.1),y = rbern(1000, 0.1), z = rbern(1000, 0.1))
Когда x = 1, я хотел бы нарисовать «w» на графике с цветом (скажем, синим). Когда y = 1, я хотел бы нарисовать «w» на графике с цветом (скажем, красным). Когда z = 1, я хотел бы нарисовать «w» на графике цветом (скажем, зеленым). Когда x, y или z = 0, мне не нужны очки. В случае, если они перекрываются, я хотел бы уклониться (но не обязательно...)
Как я могу это сделать с помощью ggplot2? особенно с geom_point?
Я попробовал следующее только для одного «x», но он отображает как 1, так и 0.
ggplot(q , aes (v,w,color = x))+geom_point()
Заранее спасибо.
@tjebo из пакета "RLab"... отредактировал вопрос, чтобы упомянуть :)
Вы можете использовать case_when
:
library(dplyr)
q <- q %>% mutate(color = factor(case_when(
x == 1 ~ "blue",
y == 1 ~ "red",
z == 1 ~ "green"), levels=c("blue","green","red")))
ggplot(q[!is.na(q$color),])+
geom_point(aes(x=v,y=w,color=color))+
scale_color_manual(values=c("blue","green","red"))
см. редактирование, чтобы убедиться, что фактор соответствует цвету
Я думаю, что лучший способ - сначала изменить (расплавить) набор данных, иначе вы не увидите точки с несколькими цветами. Судя по вашему описанию, вы хотите получить несколько баллов, если, скажем, x
и y
равны 1.
Преобразование в длинную форму (или melt
ing на языке data.table) создаст три строки для каждой из ваших строк, по одной для x
, y
и z
. Затем вы можете выбрать только те строки, где value
равно 1 (точки, которые вы хотите показать). Фактор variable
соответствует x
, y
или z
, так что теперь легко установить нужные цвета и уклонение.
library(data.table)
setDT(q)
qlong <- melt(q, id.vars = c("v","w"))[value==1]
ggplot(qlong, aes(v,w,group=variable,color=variable)) +
geom_point(position=position_dodge2(width = .2))
спасибо, я добавил больше пояснений
поэтому, если я заменю x,y,z на x * w, x * y , x * z и do q[q==0]<-NA , я смогу построить обычный способ... все еще на рынке для лучшего, более эффективного решения, если оно у кого-то есть. Остальное закрою вопрос через 1 день.