使用因子变量在R中手动更改y轴刻度标签

5

我有以下数据:

id <- rep(1:100)
A <- rep(c(0.12 ,0.25, 0.5, 1, 2), each = 20)
B <- rep(c(0.06, 0.03, 0.015, 0.12), each = 25)
C <- rep(c(0.015, 0.03, 0.06, 0.12, 0.25), each = 20)

df <- data.frame(id,A,B,C,stringsAsFactors = F)

我把A、B和C分成两列。请注意,A、B和C实际上是因素,我只是避免将它们指定为因素来创建小提琴图。

library(dplyr)

df_edited <- df %>%
  gather(key, value, -id, factor_key = F)

我用这些数据创建了以下图表:
library(ggplot2)

factor_breaks <- c(0.015,0.03,0.06,0.12,0.25,0.5,1,2)
factor_levels <- c("0.015","0.03","0.06","0.12","0.25","0.5","1","2")

ggplot(df_edited, aes(key, value))+
  geom_violin()+
  scale_y_continuous(labels = factor_levels, breaks = factor_breaks)

这将创建以下图形:enter image description here 是否可能使y轴标签安全地均匀放置,如下图所示,并仍然确保小提琴图是正确的?
ggplot(df_edited, aes(key, factor(value)))+
  geom_violin()

enter image description here

2个回答

4

一种选择是转换y轴的值。

ggplot(df_edited, aes(key, value))+
 geom_violin()+
 scale_y_continuous(labels = factor_levels,
                    breaks = factor_breaks,
                    trans = 'log10')

enter image description here


杰出而简单的解决方案。谢谢! - Haakonkas

2

在这个例子中,使用log10也可以,但我认为使用sapply“重新调整”值更加通用:

df_edited$newValue <- sapply(as.character(df_edited$value), 
                             function(x){which(factor_levels == x)})

这基本上返回在factors_levels向量中值的位置。
ggplot(df_edited, aes(key, newValue))+
  geom_violin() + 
  scale_y_continuous(breaks = 1:length(factor_levels), 
                     labels = factor_levels)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接