【发布时间】:2017-06-12 21:52:47
【问题描述】:
我正在尝试利用 data.table 和 ggplot2 功能中的高级技巧来创建一个简单而强大的函数,该函数会自动将任意 data.table 的所有列 (y) 绘制(在一个图像中!)为输入列 (x) 的函数,可选地以列 (k) 为条件 - 这样我们就可以使用单行快速可视化所有数据列,如下所示:
dt <- data.table(diamonds[1:100,])[order(carat),cut:=as.character(cut)]
plotAllXYbyZ(dt)
plotAllXYbyZ(dt, x="carat", k="color")
plotAllXYbyZ(dt, x=1, y=c(2,8:10), k=3)
澄清:挑战在于列可以是任何一种类型(数字、字符或因子)。我们想要一个自动处理这个问题的函数。 - 即它应该能够使用 melt 和 ggplot 绘制所有请求的列,正如我在下面的答案中所尝试的那样。
更新:我的代码发布在下面的答案中。它是功能性的(即显示所需的图)。但是它有一个问题,即:它修改了原始的data.table。 - 为了解决这个问题,我在这里提出了一个新问题:Don't want original data.table to be modified when passed to a function
【问题讨论】:
-
您的意思是将
x、y和z作为索引或字符串传递吗?plotAllXYbyZ(dt, x=1, y=3:10, z=2)看起来像您想要传递列索引,但aes(get(x))看起来像字符串,它期望x = "mpg"作为输入。选择一个并坚持下去。 -
另外,正如
diamonds数据将说明的那样,当您有混合数据类型时,融合和分面是一个糟糕的解决方案 - 您最终会尝试在value中混合分类和数字数据柱子。我不知道您希望diamonds数据输出的外观如何。看看ggExtra::ggpairs,你可能可以破解那个函数来做你想做的事。 -
as.numeric(as.character())的转换在应用于diamonds$clarity时没有意义。在 y 轴上具有多个数字化因子和连续 x 轴的线图对我来说也没有用处。 -
投票结束时“不清楚你在问什么”,因为这似乎没有经过深思熟虑。
-
澄清:我们想要创建一个可以绘制所有这些的绘图函数:NUMERIC、FACTOR、CHARACTER。 IE。它会自动将任何 FACTOR、CHARACTER 列转换为 NUMERIC,以便可以绘制它们。 (所以用户不需要担心这些)。这就是我输入的原因:
as.numeric(as.character())。此行将处理diamonds,其中diamonds$cut <- as.character(diamonds$cut)。仅使用as.numeric()将导致NA's
标签: r ggplot2 data.table