2016-12-05 526 views
1

我试图推广一套我经常需要通过一个功能的情节 - 我有麻烦,在那里得到一些方面。R ggplot2 - geom_point自定义颜色范围和颜色

myCustomScatter <- function(df, col_x, col_y, col_z){ 
    p1 <- ggplot(df, aes(x=df[,col_x])) 
    p1 <- p1 + geom_point(aes(y=df[,col_y], color=df[,col_z])) 
    p1 <- p1 + scale_x_continuous(name=colnames(df)[col_x]) 
    p1 <- p1 + scale_y_continuous(name=colnames(df)[col_y]) 
    return(p1) 
} 

df1 <- data.frame(a=seq(1.1,9.9,1.1), b=seq(0.1,0.9,0.1), c=rev(seq(10.1, 99.9, 11.1))) 

myCustomScatter(df1, 1, 2, 3) 

这给出了如预期的以下情节。

custom plot

  1. 我需要的颜色范围进行离散基于df[,3]值 - 我需要blue为值> 90,​​90> =值> 70,yellow 70> =值> 55 ,orange for 55> = value> 25 & red代表值< = 25 - 如何指定此值?

  2. 我需要的图例的标题而不是df[,col_z]c,我可以通过colnames(df1)[3]得到 - 我该如何指定?

回答

1

使用aes_string如果你不提前知道变量名,

myCustomScatter <- function(df, col_x, col_y, col_z){ 

    ggplot(df, aes_string(x=names(df)[col_x], y = names(df)[col_y])) + 
    geom_point(aes_string(colour=names(df)[col_z])) + 
    scale_x_continuous(names(df)[col_x]) + 
    scale_y_continuous(names(df)[col_y]) + 
    scale_color_gradientn(colours = terrain.colors(5)) 
} 

df1 <- data.frame(a=seq(1.1,9.9,1.1), b=seq(0.1,0.9,0.1), c=rev(seq(10.1, 99.9, 11.1))) 

myCustomScatter(df1, 1, 2, 3) 
+0

'scale_color_gradientn(颜色=地形.colors(5))' - 这会创建一个梯度,用5种颜色将'df [,col_z]'的范围分成相等的ra年龄 - 对吧? - 然而,需要的范围是“25,55,70,90” - 如何指定? – user3206440

+0

尝试在?scale_color_gradientn的值 – baptiste

+0

我看着这个 - 但不明白如何使用它?我需要做的是指定'df [col_z,]'的离散范围并以离散颜色显示它们。 – user3206440

2

你可以试试这个:

myCustomScatter <- function(df, col_x, col_y, col_z){ 
    p1 <- ggplot(df, aes_string(x=df[,col_x], color = cut(df[,col_z], c(-Inf, 25, 55, 70, 90, Inf))), size = 6) 
    p1 <- p1 + geom_point(aes_string(y=df[,col_y])) 
    p1 <- p1 + scale_x_continuous(name=colnames(df)[col_x]) 
    p1 <- p1 + scale_y_continuous(name=colnames(df)[col_y]) # + guides(color=guide_legend('c')) 
    p1 <- p1 + scale_color_manual(name = names(df)[col_z], 
           values = c("red", 
              "orange", 
              "yellow", 
              "green", 
              "blue")) 
    return(p1) 
} 

df1 <- data.frame(a=seq(1.1,9.9,1.1), b=seq(0.1,0.9,0.1), c=rev(seq(10.1, 99.9, 11.1))) 

myCustomScatter(df1, 1, 2, 3) 

enter image description here

+0

-1,因为这不是aes_string应该如何工作的(并且映射会在更复杂的情节中失败,可能没有警告) – baptiste