2016-10-30 37 views
-1

FILE.CSV的R - ggplot由可变

group metric 
"1"  1.1 
"0"  2.2 
"0"  3.3 
"1"  4.4 

我在读上述file.csv如下面的数据帧

df <- read.csv("file.csv", header=T) 
# store col names for using later 
group_name <- colnames(df)[1] 
metric_name <- colnames(df)[2] 

在创建一个箱形图通过颜色,我需要通过颜色变量group_name

p <- ggplot(data=df, aes(x=df[,group_name], y=df[,metric_name], color=group_name)) + 
    geom_boxplot(outlier.colour="darkred", outlier.shape = NA, fill = fill, color=line, alpha = 0.5) + 
    theme(legend.position = c(1, 1), legend.justification = c(1, 1)) 
p 

问题在于,图中的图例显示为group_name,而不是变量group_name的值 - 需要做什么才能使颜色取值为变量group_name

aes中使用x=df[,group_name]的原因是为了使其通常适用于任何csv文件,整个列的名称可能未知。

+0

你为什么子集划分您的数据帧在'ggplot'调用中?做'aes(x = group,y = metric,color = group)'而不是 – yeedle

+0

它有什么关系吗? – user3206440

+0

我只是想知道你是否有任何理由为什么要像你一样存储列名。 – jazzurro

回答

0

这就是ggplot范式的工作原理。通常,分组变量是描述属性而不是数字的因子或字符向量。让我们类似于您的.csv一些随机数据:

group <- c(1,0,1,1,0,0,0,1,0,1) 
metric <- rnorm(10, 1) 
df <- data.frame(group, metric) 

你的情况,你可以使用dplyr::mutate添加一个新列的意见提出。无论你喜欢什么,你都可以调用新的列和变量。

library(dplyr) 
df.gp <- df %>% mutate(Group.new = paste("Group", group)) 

# df.gp 
# group  metric Group.new 
# 1  1 1.3100608 Group 1 
# 2  0 2.7120827 Group 0 
# 3  1 -0.2310713 Group 1 
# etc 

现在绘制数据:

library(ggplot2) 
ggplot(df.gp, aes(x=Group.new, y=metric, fill=Group.new)) + geom_boxplot() + 
theme(legend.position = c(1, 1), legend.justification = c(1, 1)) 

enter image description here

+0

这很好。但问题是为什么'color = group_name'没有提供期望的结果?这是什么解决方法?我不能提及x&y的姓氏 – user3206440

+0

我不知道。 'ggplot2'在引擎盖下很复杂,你不需要这样做。如果你想使用'ggplot2',你必须习惯它的语法。 – Joe

0

当它从评论看来,user3206440的目的是列名传递给一个函数。该ggplot办法做到这一点,因为我在评论中所提到的,如下:

customBoxPlot <- function(df, group_var, metric_var) { 

    ggplot(df, aes_string(x=group_var, y=metric_var, color=group_var)) + 
    geom_boxplot(outlier.colour="darkred", outlier.shape = NA, alpha = 0.5) + 
    theme(legend.position = c(1, 1), legend.justification = c(1, 1)) 

} 

customBoxPlot(df, names(df)[1], names(df)[2]) 
# or 
customBoxPlot(df, "group", "metric") 

这是输出的外观使用您的数据:

output