在R中,ggplot2
和lattice
包都提供了可视化数据的可能性,不仅可以通过x
和y
位置来查看数据,还可以考虑其他因素,更改颜色,观察表示的大小或形状(点,平滑线等)或将可视化分割为沿此因子的单独图表。
ggplot
的示例:
require(ggplot2)
ggplot(diamonds, aes(x = carat, y = price, col=clarity)) +
geom_point(alpha = .3)
lattice
的示例:
require(lattice)
require(mlmRev); data(Chem97, package = "mlmRev")
densityplot(~ gcsescore | factor(score), Chem97, groups = gender,
plot.points = FALSE, auto.key = TRUE)
显然,这些非常简单的方法可以将数据与另一个因素区分开来,以便与单个数据帧一起使用,其中包含要显示的所有观察结果。但是,我经常以单独的数据帧的形式具有单独的数据输入,包含要表示为x和y的不同列。然后,在图中分离的第三个因素是数据帧。数据源本身。到目前为止,我能找到的唯一解决方案是将所有数据合并到一个数据帧中,然后在每个源数据帧中添加另一个列,仅包含第三个因子resp。数据源(因此在此列的每个单元格中都有相同的字符串表达式)。最后,ggplot2和格子然后能够通过第三个因子再次分离数据,并按照希望分离它们。
现在到了最后的问题:这似乎是一个非常糟糕的工作流程,对于更大量的数据效率不高。是否有另一种方法可以实现相同的结果,或者至少是一种有效自动化最后描述的工作流程的方法?
答案 0 :(得分:0)
使用ggplot
时,将更多数据源合并为一个通常是个好主意。当然有例外,ggplot
提供了处理这种情况的工具。
也就是说,可以将data
参数传递给每个geom_*
我使用的一般规则是,如果在同一geom_*
中使用不同的数据源,则必须将它们组合在一起,如果它们将在不同的geom_
中使用,它们可以(并且可能)应该保持分开。
geom_*
df1 <- data.frame(group = LETTERS[1:3],
obs = runif(3))
df2 <- data.frame(group = LETTERS[1:3],
obs = runif(3))
library(purrr)
dfT <- list(df1 = df1, df2 = df2) %>%
map_df(~rbind(.x), .id = 'src')
library(ggplot2)
ggplot(dfT, aes(x = group, y = obs)) +
geom_line(aes(group = src, color = src), size = 1)
df1 <- data.frame(group = LETTERS[1:3],
hValue = runif(3))
df2 <- data.frame(group = rep(LETTERS[1:3], each = 3),
pValue = runif(9))
library(ggplot2)
ggplot() +
geom_line(data = df1, aes(x = group, y = hValue, group = 1), size = 1) +
geom_point(data = df2, aes(x = group, y = pValue, color = group))