2015-07-28 21 views
5

Çubuk grafiğinin renkleri 'MaskID' temellidir ve bu kodda 'MaskID' adlarını metin etiketlerine dönüştürebiliyorum, ancak adların ortalanmasını istiyorum. onların karşılık gelen renkleri.Yığılmış çubuk grafikleri üzerinde metin etiketlerinin ortalanması

Bunu nasıl yaparsınız?

p <- ggplot(df, aes(x, y)) 
p <- p + xlab("xlabel") 
p <- p + ylab("ylabel") 
p <- p + ggtitle("ylabel vs xlabel") 
p <- p + geom_bar(stat="identity", aes(fill=MaskID)) 
p <- p + theme(axis.text.x = element_text(angle=90, vjust=-0.005)) 
p <- p + geom_text(aes(label = ifelse(y != 0, as.character(MaskID), ''), angle=90)) 

 MaskID  x  y 
0  ABC Name1  0 
1  ABC Name2  0 
2  ABC Name3  1 
3  ABC Name4  0 
..  ...  ... ... 
100  DEF Name1  0 
101  DEF Name2  0 
102  DEF Name3  3 
103  DEF Name4  4 
104  DEF Name5  0 

Burada bina olduğum Grafiğin parçası (Ayrıca metin etiketleri 0 y değerlerine sahip çubuklar için görünmüyor düşünün):

enter image description here

+1

bir [tekrarlanabilir Örnek] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) büyük olurdu. –

+0

Verilerimin neye benzediğine dair temel bir örnek yayınladım! – anonymous

+1

[Yeniden üretilebilir örnek] ile (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), yeniden üretebileceğimiz bir şey kastediyorum. –

cevap

5

Bu işe yarıyor, bunun için biraz karmaşık olsa da düşünüyorum. Çubuk konumlarını açıklayan verileri çıkarmak, orta noktalarını ve uygun etiketleri bulmak için ggplot_build kullanır ve ardından metni ekler.

## Make the graph (-the text parts) 
p <- ggplot(df, aes(x, y)) 
p <- p + xlab("xlabel") 
p <- p + ylab("ylabel") 
p <- p + ggtitle("ylabel vs xlabel") 
p <- p + geom_bar(stat="identity", aes(fill=MaskID)) 
p <- p + theme(axis.text.x = element_text(angle=90, vjust=-0.005)) 

## Get the bar data from ggplot 
dd <- ggplot_build(p)[[1]][[1]] 

## Get the y-values in the middle of bars 
xy <- unique(dd[dd$y != 0, c("x", "y")]) 
dat <- with(xy, data.frame(
    x=x, 
    y=unlist(sapply(split(y, x), function(z) diff(c(0, z))/2 + head(c(0, z), -1))) 
)) 

## Get the labels 
labels <- with(df[df$y!=0,], unlist(split(MaskID, x))) 

## Add the text using the new xy-values and labels 
p + geom_text(data=dat, aes(x, y), label=labels, angle=90) 

enter image description here

+0

Teşekkürler! Metin etiketleri artık çubuğun ortasındadır ... ancak MaskID adlarını etiketler olarak koymak yerine, çubukların ne kadar yüksek olduğuna dair y-değeri numaraları koyulur. – anonymous

+0

'Etiketler' ile ne demek istiyorsun? MaskID'deki isimler sayı ve karakterlerden oluşur + – anonymous

+0

Oh, üzgünüm! Ve 'etiketler' değişkeni, karşılık gelen numaralara göre takip edilen metin adlarının bir listesidir. Örneğin, Name3'ün altında bir sayı olur ve Name4'ün altında başka bir sayı olur, vb. – anonymous

İlgili konular