基本语法:
p = ggplot(df, aes(x="", y = value, fill=group)) +
geom_bar(width = 1, stat = "identity") +
coord_polar("y", start=0)
示例:
library(ggplot2)
#数据准备
df1 = data.frame(
group = c("c", "b", "a"),
value = c(15, 35, 50))#基本成图1
p = ggplot(df1, aes(x="", y = value, fill=group)) +
geom_bar(width = 1, stat = "identity") +
coord_polar("y", start=0)
p
#图形美化
require(scales)
p + scale_fill_brewer("Blues") +
geom_text(aes(y = value/3 + c(0, cumsum(value)[-length(value)]),
label = percent(value/100)), size=5)+
theme(
axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.x=element_blank(),
panel.border = element_blank(),
panel.grid=element_blank(),
axis.ticks = element_blank(),
plot.title=element_text(size=14, face="bold")
)
讨论(注意事项):
若把上述的数据换为如下数据,即把a和c 两组数据交换位置:
df1 = data.frame(
group = c("a", "b", "c"),
value = c(50, 35, 15))
则会出现如下情况,数值对不上对应的区域。
造成这种情况的原因是作图时数据是按group的升序、逆时针的顺序进行的,即从正上方开始,按逆时针方向一次是a,b,c三组数据的图像(会自动进行这样的排序),而对应数字的添加是按value的原顺序进行顺时针添加的。
解决(相对原数据框按照group进行降序排列):
这样可以使数值添加的顺序和绘图顺序一致。将原始数据进行如下处理:
df1 = data.frame(
group = c("a", "b", "c"),
value = c(50, 35, 15))df2 = df1[order(df1$group,decreasing = TRUE),]
df2
因此我们使用的数据应该是按组号的降序排列的数据,而在绘图前先进行降序处理可以解决这一问题。
无脑可用代码:
library(ggplot2)
#df1改为自己的数据(数据中的group,value进行对应,这两个变量名称别换)
df1 = data.frame(
group = c("a", "b", "c"),
value = c(50, 35, 15))
df2 = df1[order(df1$group,decreasing = TRUE),]
p = ggplot(df2, aes(x="", y = value, fill=group)) +
geom_bar(width = 1, stat = "identity") +
coord_polar("y", start=0)
require(scales)
p + scale_fill_brewer("Blues") +
geom_text(aes(y = value/length(value) + c(0, cumsum(value)[-length(value)]),
label = percent(value/sum(value))), size=5)+
theme(
axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.x=element_blank(),
panel.border = element_blank(),
panel.grid=element_blank(),
axis.ticks = element_blank(),
plot.title=element_text(size=14, face="bold")
)
必要补充plot做法:
这里使用plot进行作图更简单。
df2 = data.frame(
group = c("a", "b", "c"),
value = c(50, 35, 15))pie(df2$value,df2$group)