根据动态值集分配固定的ggplot2形状

时间:2018-07-23 18:24:31

标签: r ggplot2 powerbi

我正在研究Power BI项目,并且正在制作一些R视觉效果。视觉效果之一是散点图。每个点都有一个分类值(“是”,“否”)。我选择通过形状表示这些类别。有时,用户会以这样的方式查询数据,即每个点只有一个类别。我希望我的“是”形状仅对“是”值保持唯一,而我的“否”形状仅对“否”值保持唯一。

我的代码:

ggplot(data = dataset) + 
    geom_point(data = dataset, aes(x= value1 y=value2, shape = YesNo_column) + 
    scale_shape_manual(name="", values = c(20, 0))

我希望“是”点始终具有形状“ 20”,而“否”点始终具有形状“ 0”。如果用户查询数据仅显示“否”点,则我的代码将为这些点分配形状“ 20”,而不是形状“ 0”。

编辑:我刚刚制作了一些示例数据来显示我的问题:

query1 <- mtcars[mtcars$cyl == 4 | mtcars$cyl == 6,]

query1$YesNo_column <- "blah"

query1[query1$cyl==4,]$YesNo_column <- "Yes"
query1[query1$cyl==6,]$YesNo_column <- "No"


ggplot(query1, aes(x=mpg, y=hp, shape=YesNo_column)) + 
  geom_point()+
  scale_shape_manual(name="",values = c(20, 0))


query2 <- query1[query1$YesNo_column == "Yes",]

ggplot(query2, aes(x=mpg, y=hp, shape=YesNo_column)) + 
  geom_point()+
  scale_shape_manual(name="",values = c(20, 0))

如您所见,形状并不固定为值。

1 个答案:

答案 0 :(得分:1)

确保将您的yesno编码为一个因子,并简单地使用DROP = FALSE

library(tidyverse)

mydata <- tibble(
  x = rnorm(20, 1.0, 0.3),
  y = rnorm(20, 1.5, 0.4),
  response = sample(c("yes", "no"), replace = TRUE, size = 20)
) %>% 
  mutate(response = as.factor(response))


ggplot(mydata, aes(x = x, y = y, shape = response)) + 
  geom_point() + 
  scale_shape_manual(name="", values = c(20, 0), drop = FALSE)

mydata %>%
  filter(response == "yes") %>% 
  ggplot(aes(x = x, y = y, shape = response)) + 
  geom_point() + 
  scale_shape_manual(name="", values = c(20, 0), drop = FALSE)

First

Second