Создайте составной участок или круговой график
Цель
Создайте график с областями с накоплением или круговой график с накоплением (см. Рисунок). Круговая диаграмма не нужна.
Данные и код гистограммы
#Data set:
Numbers 16%
Frosts 2%
Doors 6%
Shelfs 10%
Earning -3%
par(mai=c(2, 1, 1, 1), lwd=2)
barplot(as.numeric(c(16, 2, 6, 10, -3)), col = c("lightblue"), main="Bar plot",
names.arg=c("Numbers","Frosts","Earning", "Doors","Shelfs"), xpd=TRUE, las=2, lwd=2,
axes=FALSE, axis.lty=1, cex.axis=1, cex.names=1, cex.main=1, ylim=c(-4, 18), xlim=c(0, 5))
Два варианта вывода
3 ответа
Это должно дать вам большую часть пути там
library(ggplot2)
df<- data.frame(value=as.numeric(c(16, 2, 6, 10, -3)),
cat=c("Numbers","Frosts","Earning","Doors","Shelfs"))
ggplot(df[order(df$value),], aes(x=1, y=abs(value), fill=factor(ifelse(value>0, 0, 1)))) +
geom_bar(stat="identity", colour="grey") +
geom_text(aes(label=paste(cat, value)), position = "stack", vjust = 3) +
scale_fill_manual(values=c("white", "red"))
ggplot(df[order(df$value),], aes(x=1, y=abs(value), fill=factor(ifelse(value>0, 0, 1)))) +
geom_bar(stat="identity", colour="grey") +
geom_text(aes(label=paste(cat, value)), position = "stack", vjust = -1) +
scale_fill_manual(values=c("white", "red")) +
coord_polar()
Возможно, вам придется поиграться со значениями vjust, чтобы изменить положение меток, или рассчитать для них собственное отображение y, но это хорошее начало.
Вы можете попробовать поработать с этим:
library(ggplot2)
data<-data.frame(Name=c("Earning","Frosts","Doors","Shelfs","Numbers"),Val=c(1,2,6,10,16))
ggplot(data,aes(x=factor(1),y=Val,fill=Name))+
geom_bar(stat="identity",width=1)+coord_polar()
Просто измените цветовую палитру и добавьте текст, где вы хотите (и, конечно, первое значение в Val
столбец, если он слишком большой на участке - это соответствует вашему отрицательному значению)
Самая верхняя из ссылок "Связанные" справа должна дать вам большую часть информации, которая необходима для построения линейчатой диаграммы, но адаптированной для вашего использования, это будет примерно так:
# A vertical matrix containing the values
md <- matrix(c(-3, 16, 2, 6, 10), ncol=1)
d <- barplot(md, col=c(2, rep(0, 4)))
# Finding the vertical position for the labels
ypos <- apply(md, 2, cumsum)
ypos <- ypos - md/2
ypos <- t(ypos)
# I haven't checked if the values and names match
text(d/3, ypos, adj=c(0, NA),
paste(c("Earning","Numbers","Frosts","Doors","Shelfs"), md, sep=": "))