ggplot:为散点图绘制数据

时间:2014-10-31 04:31:54

标签: r ggplot2 shape

我有一个如下数据框(想象多个市场,1个市场:2个变量):

 Market    Variables  median  lower.limit  upper.limit
 market_1   var_1      2.78    2.71         2.72
 market_1   var_2      3.21    2.96         3.44
 market_2   var_1      2.95    2.79         3.11
 market_2   var_2      2.11    1.91         2.30

我想用数据的胡须(var_1 vs var_2)进行散点图,但我无法理解如何重塑数据。我认为数据框架需要从长到宽,但我不知道如何处理转换中的下限/上限。我的专栏是:

  Market    var_1    var_1_lower.limit   var_1_upper.limit    var_2_median    var_2_lower.limit    var_2.upper.limit

或者有没有办法直接用ggplot对我的数据进行子集化?

2 个答案:

答案 0 :(得分:2)

如果您想将数据重新塑造为wide表单,可以使用reshape中的base R

reshape(df, idvar="Market", timevar='Variables', direction='wide')
#    Market median.var_1 lower.limit.var_1 upper.limit.var_1 median.var_2
#1 market_1         2.78              2.71              2.72         3.21
#3 market_2         2.95              2.79              3.11         2.11
#  lower.limit.var_2 upper.limit.var_2
#1              2.96              3.44
#3              1.91              2.30

或使用dplyr/tidyr

library(dplyr)
library(tidyr)
df %>% 
    gather(Var, Val, median:upper.limit) %>% 
    unite(VarN,Variables, Var, sep="_") %>%
    spread(VarN, Val)

#    Market var_1_lower.limit var_1_median var_1_upper.limit var_2_lower.limit
#1 market_1              2.71         2.78              2.72              2.96
#2 market_2              2.79         2.95              3.11              1.91
#   var_2_median var_2_upper.limit
#1         3.21              3.44
#2         2.11              2.30

或使用dcast/melt

中的reshape2
 library(reshape2)
 dcast(melt(df, id=c("Market", "Variables")), Market~..., value.var='value')
 #         Market var_1_median var_1_lower.limit var_1_upper.limit var_2_median
 #1 market_1         2.78              2.71              2.72         3.21
 #2 market_2         2.95              2.79              3.11         2.11
 #  var_2_lower.limit var_2_upper.limit
 #1              2.96              3.44
 #2              1.91              2.30

数据

df <- structure(list(Market = c("market_1", "market_1", "market_2", 
"market_2"), Variables = c("var_1", "var_2", "var_1", "var_2"
), median = c(2.78, 3.21, 2.95, 2.11), lower.limit = c(2.71, 
2.96, 2.79, 1.91), upper.limit = c(2.72, 3.44, 3.11, 2.3)), .Names = c("Market", 
"Variables", "median", "lower.limit", "upper.limit"), class = "data.frame", row.names = c(NA, 
-4L))

答案 1 :(得分:1)

使用reshape2的另一种方法:

library(reshape2)
mm = melt(ddf, id=c('Market',"Variables"))
dcast(mm, Market~Variables+variable)
    Market var_1_median var_1_lower.limit var_1_upper.limit var_2_median var_2_lower.limit var_2_upper.limit
1 market_1         2.78              2.71              2.72         3.21              2.96              3.44
2 market_2         2.95              2.79              3.11         2.11              1.91              2.30

但是您不需要重新塑造错误栏等等:

ggplot(ddf)+geom_errorbar(aes(x=Variables, y=median, ymin=lower.limit, ymax=upper.limit, color=Market))+geom_point(aes(x=Variables, y=median, color=Market))

enter image description here