使用ggplot2表示散点图中每个点的小饼图

时间:2014-10-26 20:38:39

标签: r ggplot2 pie-chart scatter-plot

我想创建一个散点图,其中每个点都是一个小饼图。例如,考虑以下数据:

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()

enter image description here

以下代码将为每个点制作一个饼图:

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

enter image description here

但我希望合并它们:创建一个散点图,其中每个点都被饼图替换。这样我就可以在同一个图表中显示每条记录的所有5个值(X,Y,A,B,C)。

无论如何都要这样做?

2 个答案:

答案 0 :(得分:7)

您可以使用 ggsubplot 包进行此类操作。不幸的是,根据问题#10 here,此软件包不适用于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

这给出了基本的想法,尽管还有许多其他选项(比如在绘图空间中存在重叠时控制子图移动到的位置)。

This answer提供了有关较新R版本的 ggsubplot 状态的更多信息。

答案 1 :(得分:0)

有一个散布的包裹,它确实可以满足您的需求!

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为中心)。

请注意,虽然您会得到一个饼图颜色的图例,但据我所知,它不会在饼图上自己标记这些切片。