在ggplot2中的log10刻度轴上将y轴扩展为负数

时间:2018-07-13 17:54:09

标签: r ggplot2 facet-wrap geom-text

我正在绘制带有2组标签的点和线的组合。我想在点的上方和下方绘制标签,如下所示。同时为了更好地阅读,我在y轴上使用了log10刻度,并且一切正常,除了一些标签不在图表区域之外,而且我已经使用并尝试了许多帖子中建议的每种方法,以查看是否我有没有得到满意的结果。我正在寻找以下两种解决方案之一:

1-将y轴扩展为负数,以便可以看到标签。请注意,ylimlimits=c(x,y)不适用于log比例或sqrt比例(如果数字为负)

2-欺骗geom_text以使标签可见,而与y限制无关。请注意,我已经尝试过vjust="inward"并可以正常使用,但是随后我不得不使用geom_text_repel来移动标签并使其难以阅读,因此我仍然喜欢将标签放在顶部点的底部和底部

感谢您的帮助!

以下是生成数据帧的代码:

df1_InSAP_Only <- structure(list(Year_Month = c(
    "2016_06", "2016_06", "2016_07", 
    "2016_07", "2016_08", "2016_08", "2016_09", "2016_09", "2016_09", 
    "2016_09", "2016_10", "2016_10", "2016_10", "2016_10", "2016_11", 
    "2016_11", "2016_12", "2016_12", "2017_01", "2017_01", "2017_01", 
    "2017_02", "2017_02", "2017_02", "2017_02", "2017_03", "2017_03", 
    "2017_03", "2017_03", "2017_03", "2017_03", "2017_04", "2017_04", 
    "2017_04", "2017_04", "2017_04", "2017_05", "2017_05", "2017_05", 
    "2017_05", "2017_05", "2017_05", "2017_06", "2017_06", "2017_06", 
    "2017_06", "2017_06", "2017_06", "2017_07", "2017_07"), 
    Business = c("A", 
     "E", "A", "B", "B", "E", "F", "A", "H", "B", "A", "D", "B", "E", 
     "B", "E", "F", "B", "F", "B", "E", "A", "B", "C", "E", "F", "A", 
     "G", "D", "B", "E", "F", "A", "G", "B", "E", "F", "A", "D", "B", 
     "C", "E", "F", "A", "D", "B", "C", "E", "F", "A"),
    `MMR Count` = c(2L, 
      1L, 1L, 7L, 2L, 1L, 1L, 3L, 1L, 5L, 1L, 1L, 4L, 1L, 8L, 4L, 1L, 
      4L, 2L, 2L, 2L, 3L, 8L, 1L, 2L, 1L, 7L, 1L, 4L, 9L, 2L, 4L, 10L, 
      2L, 15L, 7L, 4L, 27L, 2L, 14L, 1L, 6L, 9L, 31L, 5L, 14L, 1L, 
      4L, 5L, 21L),
     `Duration Average` = c(37, 20, 9, 8, 2, 5, 1, 1, 
      1, 14, 1, 19, 8, 1, 21, 77, 1, 18, 8, 1, 1, 194, 9, 14, 19, 1, 
      10, 1, 6, 9, 18, 4, 12, 170, 7, 35, 9, 10, 7, 12, 3, 15, 5, 9, 
      10, 10, 18, 11, 16, 14)), .Names = c("Year_Month", "Business", 
      "MMR Count", "Duration Average"), row.names = c(NA, 50L), class = "data.frame")

以下是生成绘图的代码:

library(ggplot2)
ggplot(df1_InSAP_Only,
        aes(x=Year_Month,
            y=`Duration Average`,
            group=Business,
            color=Business,
            size=`MMR Count`)) +
  geom_line(aes(group=Business),stat="identity", size=1, alpha=0.7) +
  geom_point(aes(colour=Business, alpha=0.7)) +
  facet_wrap(~ Business, ncol=2) +
  scale_y_log10( limits=c(-100,1000),breaks=c(0,1,10,100,1000)) +   
  scale_alpha_continuous(range = c(0.5,1), guide='none') + #remove the legend for alpha
  geom_text(data=. %>% dplyr::group_by(Business),
            aes(label=`Duration Average`,vjust=-2),
            size=3,
            position = position_dodge(width=0.9)) +
  geom_text(data=. %>% dplyr::group_by(Business),
            aes(label=`MMR Count`,vjust=3),
            size=3,
            position = position_dodge(width=0.9),
            color="brown")

这是情节:

enter image description here

1 个答案:

答案 0 :(得分:3)

您不能使记录的y刻度变为负数-未定义负数的对数。使其接近0即可。这是带有

的图形
scale_y_log10(limits=c(.1, 1000),breaks=c(1, 10, 100, 1000))

enter image description here

如果您想要更多(取决于最终绘图的大小,文本的大小,vjust的数量),请转到0.05或0.01 ...

我也强烈建议对您的x轴数据使用Date格式,看看这些轴标签有多好(以及在垂直网格线更少的情况下该图看起来更清晰)。

df1_InSAP_Only$date = as.Date(paste0(df1_InSAP_Only$Year_Month, "_01"), format = "%Y_%m_%d")

 # use date column on x-axis
 # reduce vjust amounts
 # get rid of meaningless group_by() statements
 # get rid of unused position dodges
ggplot(df1_InSAP_Only,
        aes(x=date,
            y=`Duration Average`,
            group=Business,
            color=Business,
            size=`MMR Count`)) +
  geom_line(aes(group=Business),stat="identity", size=1, alpha=0.7) +
  geom_point(aes(colour=Business, alpha=0.7)) +
  facet_wrap(~ Business, ncol=2) +
  scale_y_log10( limits=c(.1,1000),breaks=c(1,10,100,1000)) +   
  scale_alpha_continuous(range = c(0.5,1), guide='none') + #remove the legend for alpha
  geom_text(aes(label=`Duration Average`,vjust=-1),
            size=3) +
  geom_text(aes(label=`MMR Count`,vjust=2),
            size=3,
            color="brown")

enter image description here