我必须使用组变量As
和子组变量ADs
绘制频率数据。可视化频率即饼形图或马赛克的最佳方法是什么? ggplot2中有没有可用的功能?
df <- data.frame(As=c('GeA','GeA','GeA', 'GA'),
ADs=c('A44','A33','A37','A141'),
freq=c(501,65,50,103))
# As ADs freq
# 1 GeA A44 501
# 2 GeA A33 65
# 3 GeA A37 50
# 4 GA A141 103
有些想法如下:
然而,有没有办法在一个图中区分组和子组?
在提出的解决方案中,two charts下面看起来很有希望。
饼图&amp;平铺图
我使用了Masoud建议的以下代码。
df.2 <- df
df.2$ymax <- with(df.2, ave(freq, As, FUN=cumsum))
df.2$ymin <- lag(df.2$ymax, default = 0)
df.2$ymin <- ifelse(lag(as.character(df.2$As), default = 0) != df.2$As, 0, df.2$ymin)
df.legend <- df.2[with(df.2, order(As)), ]
library(ggplot2)
# Pie Chart
ggplot(df.2) +
geom_rect(aes(fill=As, ymax=ymax, ymin=ymin, xmax=4, xmin=3)) +
geom_rect(aes(fill=ADs, ymax=ymax, ymin=ymin, xmax=3, xmin=0)) +
xlim(c(0, 4)) +
theme(aspect.ratio=1) +
coord_polar(theta="y") +
scale_x_continuous(breaks=c(0,3), labels=c("ADs", "As")) +
annotate("text", x=rep(1.5,4), y=c(50, 350,530,590),
label= as.character(df.legend$ADs)) +
annotate("text", x=rep(3.5,2), y=c(50, 350),
label= as.character(unique(df.legend$As))) +
theme(legend.position="none", axis.title.x=element_blank(),
axis.title.y=element_blank())
# Tile Graph
ggplot(df.2) +
geom_rect(aes(fill=As, ymax=ymax, ymin=ymin, xmax=4, xmin=3)) +
geom_rect(aes(fill=ADs, ymax=ymax, ymin=ymin, xmax=3, xmin=0)) +
xlim(c(0, 4)) + theme(aspect.ratio=1) +
scale_x_continuous(breaks=c(1.5,3.5), labels=c("ADs", "As")) +
annotate("text", x=rep(1.5,4), y=c(50, 350,530,590),
label= paste(as.character(df.legend$ADs), df.legend$freq,sep= " = ")) +
annotate("text", x=rep(3.5,2), y=c(50, 350),
label= as.character(unique(df.legend$As))) +
theme(legend.position="none", axis.title.x=element_blank(),
axis.title.y=element_blank())
但是,我没有得到相同的输出
饼图&amp;平铺图
消息:“x”的比例已经存在。为'x'添加另一个比例,它将取代现有的比例。
你能告诉我这是什么问题吗?使用的软件包版本有什么不同吗?
答案 0 :(得分:2)
您可以使用堆积条形图:
library(ggplot2)
ggplot(data = df, aes(x = As, y = freq, fill = ADs)) +
geom_bar(stat = "identity")
你可以在剧情上添加这个并获得标签:
p + geom_text(aes(label = paste(ADs, freq, sep=": ")),
position = position_stack(vjust = 0.5), size = 3) + #subgroups
stat_summary(fun.y = sum, aes(label = ..y.., group = As), geom = "text") + #groups
theme(legend.position="none")
接下来的两个答案是参考post。
为此,我们需要调整数据:
df.2 <- df
df.2$ymax <- with(df.2, ave(freq, As, FUN=cumsum))
df.2 <- df.2[with(df.2, order(As)), ]
#for some reason lag function does not work properly in R 3.3.3
library(data.table)
setDT(df.2)[, ymin:=c(0,ymax[-.N])]
df.legend <- df.2[with(df.2, order(As)), ]
然后我们可以再次使用ggplot
:
ggplot(df.2) +
geom_rect(aes(fill=As, ymax=ymax, ymin=ymin, xmax=4, xmin=3)) +
geom_rect(aes(fill=ADs, ymax=ymax, ymin=ymin, xmax=3, xmin=0)) +
xlim(c(0, 4)) + theme(aspect.ratio=1) +
scale_x_continuous(breaks=c(1.5,3.5), labels=c("ADs", "As")) +
annotate("text", x=rep(1.5,4), y=c(50, 350,530,590),
label= paste(as.character(df.legend$ADs), df.legend$freq,sep= " = ")) +
annotate("text", x=rep(3.5,2), y=c(50, 350),
label= as.character(unique(df.legend$As))) +
theme(legend.position="none", axis.title.x=element_blank(),
axis.title.y=element_blank())
ggplot(df.2) +
geom_rect(aes(fill=As, ymax=ymax, ymin=ymin, xmax=4, xmin=3)) +
geom_rect(aes(fill=ADs, ymax=ymax, ymin=ymin, xmax=3, xmin=0)) +
xlim(c(0, 4)) +
theme(aspect.ratio=1) +
coord_polar(theta="y") +
scale_x_continuous(breaks=c(0,3), labels=c("ADs", "As")) +
annotate("text", x=rep(1.5,4), y=c(50, 350,530,590),
label= as.character(df.legend$ADs)) +
annotate("text", x=rep(3.5,2), y=c(50, 350),
label= as.character(unique(df.legend$As))) +
theme(legend.position="none", axis.title.x=element_blank(),
axis.title.y=element_blank())