使用ggplot2创建散点图中的每个数据点的小型饼图。

4

我希望创建一个散点图,在该图中,每个点都是一个微小的饼图。例如,考虑以下数据:

foo <- data.frame(X=runif(30), Y=runif(30),A=runif(30),B=runif(30),C=runif(30))

以下代码将绘制散点图,表示每个点的XY值:
library(reshape2)
library(ggplot2)
foo.m <- melt(foo, id.vars=c("X","Y"))
ggplot(foo.m, aes(X,Y))+geom_point()

在每个点上制作一个饼图的代码如下:

p <- ggplot(foo.m, aes(variable,value,fill=variable)) + geom_bar(stat="identity")
p + coord_polar() + facet_wrap(~X+Y,,ncol=6) + theme_bw()

输入图像描述

但我想把它们合并:创建一个散点图,其中每个点都被饼图替代。这样我就能在同一张图中显示每条记录的所有5个值(X、Y、A、B、C)。

有没有办法做到这一点?


@hrbrmstr 为什么?我已经抽象出了一些要点,X和Y来自主成分分析(PCA)。A、B和C是每个记录的属性(实际上它们有6个,而不是3个)。你有更好的想法来展示它们在PCA图中吗? - Ali
条形图 > 饼图。永远如此。 - hrbrmstr
@hrbrmstr 饼图可以作为散点图上的小圆圈,每个圆圈代表一个点。但是我们如何将条形图放在散点图上呢? - Ali
如何通过“变量”(无论你在馅饼中设置为什么“填充”)进行分面,让每个分面中的点大小(半径每个馅饼)与每个馅饼的半径相同。 - Gregor Thomas
2个回答

7
这是使用包 ggsubplot 可能实现的事情。不幸的是,根据问题#10 这里,该软件包在R 3.1.1中无法运行。如果使用旧版本的R(3.0.3),则可以成功运行它。
使用您的长数据集,您可以将条形图放置在每个XY点上,如下所示:
library(ggplot2)
library(ggsubplot)

ggplot(foo.m) +
    geom_subplot2d(aes(x = X, y = Y, 
                    subplot = geom_bar(aes(variable, value, fill = variable), stat = "identity")),
                width = rel(.5), ref = NULL)

enter image description here

这提供了基本的思路,虽然还有许多其他选项(如控制子图在绘图空间重叠时移动到哪里)。

这个答案提供了关于ggsubplot在新版本R中的状态的更多信息。


谢谢。我有R 3.1.1,正如你所说,它会导致错误。你能否在答案中添加一个图表的快照? - Ali

2
有一个名为scatterpie的软件包,可以完美地实现您想要做的事情!
library(ggplot2)
library(scatterpie)

ggplot() + 
  geom_scatterpie(aes(x=X, y=Y, r=0.1), data=foo.m, cols=c("A", "B", "C"))


在美学上,r是馅饼的半径,您可以根据需要进行调整。它取决于图表的比例-因为您的图表从0.0到1.0,半径为1会占据整个图表(如果以0.5、0.5为中心)。
请注意,尽管您将获得有关馅饼图切片颜色的图例,但不会(据我所知)在馅饼上标记切片本身。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接