2017-09-25 118 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