具有对数刻度轴的ggplot条形图中条的方向

时间:2019-12-12 19:00:06

标签: r ggplot2 geom-bar

我正在尝试根据以下数据(dataframe = df)创建多个数据的条形图,这些数据的y轴的log10 y轴的非零值小于1,如下图所示(在graphpad中创建):

No  Perc    Codon
1   72   ATA
2   12.7273  ATG
3   8.72727  GTG
4   0.727273     ATG
5   0.363636     GTG
6   0.363636     GTG
7   0.363636     GTG
8   0.363636     GTG
9   0.363636     GTG
10  0.363636     ATA
11  0.363636     ATA
12  0.363636     ATA
13  0.363636     ATA
14  0.363636     ATA
15  0.363636     ATA
16  0.363636     ATG
17  0.363636     ATG
18  0.363636     ATG
19  0.363636     ATG
20  0.363636     ATG

graphpad image

使用ggplot获取以下数据,我试图根据其他问题的其他信息创建类似的内容,以解决我的问题(无济于事)。

ggplot(data=df,aes(x=No, y=Perc, color=Codon)) + geom_bar(stat="identity") + scale_y_log10( breaks=c(0.1, 1, 10, 100), limits=c(0.1, 100), position = "top") + coord_flip() + geom_segment( aes(x=No, xend=No, y=0.01, yend=Perc))

产生以下图像:

ggplot image

但是,我希望条形图在小于1的情况下仍沿相同的方向继续。此外,有一种方法可以将x轴重新定位到图形的顶部,并重新排列数据,以使最大的值是否在图形板生成的图像中位于顶部?

我知道其他类似的questions也描述了类似的问题,这些问题与条的方向有关,但没有解决方案。

对此新手的任何帮助或建议将不胜感激。 谢谢!

2 个答案:

答案 0 :(得分:1)

geom_barscale_y_log上表现不佳。我认为最好的方法是使用geom_segment,因为您已经在尝试了。请注意,您要让geom_segment0.01开始,但是y轴仅从0.1开始。调整aes可以使您有所作为。怎么样:

library(ggplot2)

ggplot(data = df) +
  geom_segment(aes(x = No, 
                   xend = No, 
                   y = 0.1, 
                   yend = Perc, 
                   colour = Codon),
               size = 3) +
  coord_flip() +
  scale_y_log10(name = "Perc",
                breaks = c(0.1, 1, 10, 100), 
                limits = c(0.1, 100), 
                position = "top")

如果其他人想去的话,我将以一种易于使用的方式将数据包括在这里:


txt <- "No  Perc    Codon
1   72   ATA
2   12.7273  ATG
3   8.72727  GTG
4   0.727273     ATG
5   0.363636     GTG
6   0.363636     GTG
7   0.363636     GTG
8   0.363636     GTG
9   0.363636     GTG
10  0.363636     ATA
11  0.363636     ATA
12  0.363636     ATA
13  0.363636     ATA
14  0.363636     ATA
15  0.363636     ATA
16  0.363636     ATG
17  0.363636     ATG
18  0.363636     ATG
19  0.363636     ATG
20  0.363636     ATG"

df <- read.table(text = txt, header = TRUE)

reprex package(v0.2.1)于2019-12-12创建

答案 1 :(得分:1)

让我使用search提供另一个答案。

您没有按正确的顺序放置命令,也无法进行真正的log10转换,因为小于1的值将变为负数。使用library(scales)可以进行pseudo_log转换。这是我的解决方案:

library(scales)

Codon barplot with inverted scale

希望有帮助。

Oriol