R:geom_point()使用函数来选择形状?

时间:2018-04-29 21:52:03

标签: r ggplot2

我想为geom_point电话选择三种形状之一,如下所示:

function shapen(pt) {
    if (pt$x < 10) {
        return(1);
    } else if (pt$y > 10 & pt$y < 22) {
        return(2);
    } else {
        return(3);
    }
}

p <- p + geom_point(data=rows, aes(x+bh$x,y+bh$y), shape=shapen)

但那不太合适 - 我如何检查数据行上'x'的值来确定三个或四个形状中的一个?

2 个答案:

答案 0 :(得分:2)

您需要在shape主题映射中加入aes。然后可以使用scale_shape_manual

来定制手动映射
library(ggplot2)
str(mtcars[,c("wt", "mpg", "gear")])
ggplot(mtcars, aes(wt, mpg)) + 
  geom_point(aes(shape = as.factor(gear))) + 
  scale_shape_manual(values = c("4"=1, "3"=2, "5"=4)) 

您还可以预先计算形状:

library(tidyverse)
mtcars %>% 
  mutate(myshape = case_when(
    gear >= 5 ~ 1, 
    between(gear, 2, 4) ~ 2, 
    TRUE ~ 3
  )) %>% 
  ggplot(aes(wt, mpg)) + 
  geom_point(aes(shape = myshape)) + 
  scale_shape_identity()

答案 1 :(得分:0)

您可以定义一个在矢量上正常工作并返回形状数字矢量的函数:

shape_generator <- function(x) {
    xtr <- 0
    for (i in 1:length(x)) {
        if (x[i] >= 5) {
            xtr[i] = 1
        } else if (x[i] > 2 & x[i]  <= 4) {
            xtr[i] = 2
        } else {
            xtr[i] = 3
        }
    }
    return(xtr)
}

然后将其应用于geom_point的形状aes

ggplot(mtcars, aes(wt, mpg)) + 
    geom_point(aes(shape = shape_generator(wt))) + 
    theme_gray() +
    scale_shape_identity()

enter image description here