2013-02-16 40 views
2

我在用我的代碼創建一個帶有ggplot2的barplot,其中我試圖在條的頂部添加y值,但沒有移動x的標籤軸。 geom_text可以很好地在條上添加數值,但當旋轉45度(即標籤的最後一個字母貼在軸上)時,我無法正確調整x軸標籤。bar_plot ggplot:欄和x軸標籤上的值之間的衝突

我的數據

dput(graph) 
structure(list(x = structure(1:9, .Label = c("AAAAAAAAAAAAA", 
"BBBBBBBB", "CCCCCCCCCCCCCCCC", "DDDDD", "EEEEEEEE", "FFFFFFF", 
"GGGGGGGGGGGGGGG", "HHHHHHHHHHHHHH", "IIIII"), class = "factor"), 
    y = c(1L, 5L, 10L, 1000L, 20L, 15L, 45L, 30L, 35L)), .Names = c("x", 
"y"), class = "data.frame", row.names = c(NA, -9L)) 

我的代碼:

graph <- read.table("input.txt",header=T,sep=";") 
output <- ggplot(graph,aes(x=x,y=y))+ 
    geom_bar(stat="identity")+ 
    geom_text(aes(label=y,y=(y+25)))+ 
    scale_x_discrete()+ 
    scale_y_continuous(limits=c(0,max(50 + graph$y)))+ 
    theme(axis.text.x=element_text(angle=45,vjust=0)) 
print(output) 

我不能發佈輸出的圖像,但情節看起來很好,除了x軸的刻度適合的中間x標籤而不是標籤的最後一個字母。

回答

3

您應該將hjust=1添加到axis.text.x=並將vjust=0更改爲vjust=1。要更改條的外觀,可以嘗試使用y值的變換,例如平方根,與scale_y_sqrt()。只應對geom_text()的職位進行調整。

output <- ggplot(graph,aes(x=x,y=y))+ 
    geom_bar(stat="identity")+ 
    geom_text(aes(label=y,y=(y+c(10,10,10,50,10,10,10,10,10))))+ 
    scale_y_sqrt(limits=c(0,max(50 + graph$y)),breaks=c(10,100,250,500,1000))+ 
    theme(axis.text.x=element_text(angle=45,vjust=1,hjust=1)) 
output 

enter image description here

+0

確切說,非常感謝!我應該問在另一個線程也許,但我想知道是否有可能在一個酒吧(因此Y軸),這是明顯比所有其他更大的插入一個休息,爲了更好地顯示次要的y值。例如:隱藏「DDDDD」欄可能從50到900,並使用更大的y軸縮放比例來使其他欄變大? – lqdo2000 2013-02-16 09:23:31

+0

真棒!再次感謝,它看起來很完美! – lqdo2000 2013-02-16 09:43:45

1

這裏一個GGPLOT2般的格子版本:

library(lattice) 
library(latticeExtra) 
barchart(y~x, data=dat, 
     scales = list(x = list(rot=45,cex=1.5)), 
     par.settings = ggplot2like(), axis = axis.grid, 
     panel=function(x,y,...){ 
      panel.barchart(x,y,...) 
      panel.text(x,y,label=y,col='red', 
         adj=c(0.5,-0.5),cex=2) 
     }) 

enter image description here

編輯

爲了降低棒水平之間的差異,鄰這裏NE的想法是用對數刻度:

library(lattice) 
library(latticeExtra) 
barchart(y~x, data=dat, 
     scales = list(x = list(rot=45,cex=1.5), 
         y = list(log=10)), 
     par.settings = ggplot2like(), axis = axis.grid, 
     yscale.components = yscale.components.log10ticks, 
     panel=function(x,y,...){ 
      panel.barchart(x,y,...) 
      panel.text(x,y,label=10^y,col='red', 
         adj=c(0.5,-0.5),cex=2) 
     }) 

enter image description here

+1

謝謝!這個版本也很棒! – lqdo2000 2013-02-16 09:44:57

+0

對於條形圖,日誌比例沒有多大意義,因爲條形會變爲0 – hadley 2013-02-16 14:34:44