2016-10-30 31 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