我想创建一个散点图,其中每个点都是一个小饼图。例如,考虑以下数据:
foo <- data.frame(X=runif(30), Y=runif(30),A=runif(30),B=runif(30),C=runif(30))
以下代码将制作散点图,代表每个点的X
和Y
值:
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)。
无论如何都要这样做?
答案 0 :(得分:7)
您可以使用 ggsubplot 包进行此类操作。不幸的是,根据问题#10 here,此软件包不适用于R 3.1.1。如果我使用旧版本的R(3.0.3),我就成功运行了它。
使用您的长数据集,您可以在每个X
,Y
点放置条形图,如下所示:
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)
这给出了基本的想法,尽管还有许多其他选项(比如在绘图空间中存在重叠时控制子图移动到的位置)。
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为中心)。
请注意,虽然您会得到一个饼图颜色的图例,但据我所知,它不会在饼图上自己标记这些切片。