2015-07-28 17 views
5

Màu sắc của cốt truyện được dựa trên 'MaskID' và trong mã này tôi có thể đặt tên 'MaskID' thành nhãn văn bản, nhưng tôi muốn các tên được căn giữa màu sắc tương ứng của chúng.Căn giữa nhãn văn bản trên ô được xếp chồng lên nhau

Bạn sẽ làm như thế nào?

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)) 

(Cũng xem xét rằng các nhãn văn bản không hiển thị cho các quán ăn với 0 giá trị y)

 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 

Dưới đây là một phần của đồ thị rằng tôi là tòa nhà:

enter image description here

+1

A [ví dụ tái sản xuất] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) sẽ là tuyệt vời. –

+0

Đã đăng một ví dụ cơ bản ở trên về dữ liệu của tôi có vẻ như thế nào! – anonymous

+1

Bởi [ví dụ tái sản xuất] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), tôi có nghĩa là một cái gì đó mà chúng ta có thể tái sản xuất. –

Trả lời

5

Điều này dường như làm việc, mặc dù một chút phức tạp của nó cho điều này tôi nghĩ. Nó sử dụng ggplot_build để lấy dữ liệu mô tả vị trí thanh, tìm điểm giữa của chúng và các nhãn thích hợp, sau đó thêm văn bản.

## 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

Xin cảm ơn! Các nhãn văn bản nằm ở giữa thanh bây giờ ... nhưng thay vì đặt tên MaskID làm nhãn, nó đặt số y-giá trị của các thanh cao đến mức nào. – anonymous

+0

Bạn có ý nghĩa gì với 'nhãn'? Các tên trong MaskID bao gồm các số và ký tự + số – anonymous

+0

Ồ, xin lỗi! Và biến 'nhãn' là một danh sách các tên văn bản theo sau bởi số tương ứng của chúng. Vì vậy, ví dụ, Name3 sẽ có một số dưới nó và Name4 sẽ có một số dưới nó, vv – anonymous

Các vấn đề liên quan