2017-09-25 156 views
2

我有以下數據:GGPLOT2條形圖符號上y軸

mydata <- data.frame(x = c("UK1", "UK2", "UK3", "UK4", "UK5", "UK6", "UK7"), 
        n = c(50, 55, 58, 64, 14, 18, 45), 
        F = c(-6, 17, 26, -37, 44, -22, 15), 
        z = c("a", "a", "b", "a" , "b", "b", "a")) 

我想創建列x的針對列n一個ggplot(條形圖)(x軸)(y軸)的顏色按列z分割。棘手的部分是如果F的值是正值,並且負值的話,我希望條形圖能夠繼續上升。這可能與ggplot?

+1

你得到一個豎起大拇指提供一個數據框。但是你的問題涉及'z'和'Z';後者應該是'F'來對應數據框中的那個? – MrGumble

回答

2

使用sign解決方案:

您可以使用sign()提取的F跡象,乘上nn * sign(F)

library(ggplot2) 

mydata <- data.frame(x = c("UK1", "UK2", "UK3", "UK4", "UK5", "UK6", "UK7"), 
        n = c(50, 55, 58, 64, 14, 18, 45), 
        F = c(-6, 17, 26, -37, 44, -22, 15), 
        z = c("a", "a", "b", "a" , "b", "b", "a")) 

ggplot(mydata, aes(x, n * sign(F), fill = z)) + 
    geom_bar(stat = "identity", position = "dodge") 

enter image description here

1

ggplot2中的條形圖使用geom_bar進行製作,但默認使用stat_bin,即它會爲您計算bin中的出現次數。訣竅是告訴ggplot2按原樣使用這些值。這是通過geom_bar(stat='identity')完成的。其次,要有一些上升和一些下降,你需要變量的價值,好,積極和消極。我在下面的代碼中做了一個方法。

mydata$dir <- ifelse(mydata$F < 0, -1, 1) 
ggplot(mydata, aes(x=x, y=n*dir, colour=z)) + geom_bar(stat='identity') 
+0

謝謝,但有一種方法來覆蓋x軸,使絕對值。所以軸會從60到30到0到30到60 – user8491385

+0

看看'scale_y_continuous';您必須手動設置「休息」和「標籤」。 – MrGumble

2

我的代表處是太低,無法發表評論或給予好評,所以這裏是建立在以前的一個答案:

ggplot(mydata) + 
    geom_bar(aes(x = x, y =(n*ifelse(F<0,-1,1)), fill = z), stat = "identity") + 
    scale_y_continuous(labels=abs) 

這增加的方向在1個去(無需額外的列) ,並用abs()函數轉換y軸的標籤。

+0

使用'labels = abs'的好提示 – Brian