gg_pie
gg_pie
gg_pie
PeRl
今天尝试了一下用ggplot2画饼图,转换一下极坐标就可以实现,但是和以前画heatmap的时候不一样的是,我们在卷坐标的时候需要让数据集中在一个坐标轴上。
另一个比较有挑战性的是字符化的legend,我采用的方式是先用数字替换原始的排序方式,然后替换回来。
library(ggplot2)
labels <- c("<=5", "5~10", "10~15", "15~20", ">20")
count <- c(3549,1639,2594,2661,1548)
names(labels) <- count
sort_count <- as.numeric(names(sort(labels, decreasing = T)))
df <- data.frame(
num = count,
text_num = rev(cumsum(rev(count)) - rev(count)/2),
cls = labels
)
## num text_num cls
## 3549 3549 10216.5 <=5
## 1639 1639 7622.5 5~10
## 2594 2594 5506.0 10~15
## 2661 2661 2878.5 15~20
## 1548 1548 774.0 >20
简单画一下barplot,看图例是不是正确。
bar_plot <- ggplot(df, aes(x = "", y = num, fill = as.factor(1:5))) +
geom_bar(stat = "identity", width = 1, position = "stack") +
labs(x = "", y = "distribution of lncRNAs appear in certain number cancers", title = "") +
scale_fill_manual(values =c("#e21a1c", "#cc4c01", "#225ea7", "#337b4b", "#6a51a4"), labels = df$cls) +
guides(fill=guide_legend(title = "class")) +
geom_text(
aes(y = text_num),
label = paste(as.character(round(count / sum(count), digits = 3) * 100), rep("%", 5), sep = ""),
size = 3,
colour = "white") +
theme(
axis.text.x = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank()
)
首先我们先得到在y轴上stack的barplot
然后我们按Y轴进行极坐标转换
bar_plot + coord_polar(theta = "y")
还有一种画法我比较喜欢
ggplot(df, aes(x = 2:6, y = num, fill = as.factor(1:5))) +
geom_bar(stat = "identity", width = 1, position = "stack") +
coord_polar(theta = "y", start = (pi * 3 / 2)) +
labs(x = "", y = "distribution of lncRNAs appear in certain number cancers", title = "") +
xlim(c(1,7)) +
ylim(c(0, 4000)) +
scale_fill_manual(values = c("#e21a1c", "#cc4c01", "#225ea7", "#337b4b", "#6a51a4"), labels = df$cls) +
guides(fill=guide_legend(title = "class")) +
geom_text(
aes( x = 2:6, y = num/2),
label = paste(as.character(round(count / sum(count), digits = 3) * 100), rep("%", 5), sep = ""),
size = 3,
angle = 0) +
theme_bw() +
theme(
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank()
)
计算文字旋转角度
text_angle <- 45 * count / 4000 text_angle[which(text_angle > 22.5)] <- (- 45) * count[which(text_angle > 22.5)] / 4000

浙公网安备 33010602011771号