简体   繁体   中英

Points keep getting cut off, and standard fixes don't work well with facet grid on a log scale

Novice R user here wrestling with some arcane details of ggplot

I am trying to produce a plot that charts two data ranges: One plotted as a line, and another plotted on the same plot, but as points. The code is something roughly like this:

ggplot(data1, aes(x = Year, y = Capacity, col = Process)) + 
    geom_line() + 
    facet_grid(Country ~ ., scales = "free_y") + 
    scale_y_continuous(trans = "log10") + 
     geom_point(data = data2, aes(x = Year, y = Capacity, col = Process))

I've left out some additional cosmetic arguments for the sake of simplicity.

The problem is that the points from the geom_point keep getting cut off by the x axis:

我的阴谋

I know the standard fix here would be to adjust the y limits to make room for the points:

scale_y_continuous(limits = c(-100, Y_MAX))

But here there is a separate problem due to the facet grid with free scales, since there is no single value for Y_MAX

I've also tried it using expansions:

scale_y_continuous(expand = c(0.5, 0))

But here, it runs into problems with the log scale, since it multiplies by different values for each facet, producing very wonky results.

I just want to produce enough blank space on the bottom of each facet to make room for the point. Or, alternatively, move each point up a little bit to make room. Is there any easy way to do this in my case?

This might be a good place for scales::pseudo_log_trans , which combines a log transformation with a linear transformation (and a flipped sign log transformation) to retain most of the benefits of a log transformation while also allowing zero and negative values. Adjust the sigma parameter of the function to adjust where the transition from linear to log should happen.

library(ggplot2)
ggplot(data = data.frame(country = rep(c("France","USA"), each = 5),
                         x = rep(1:5, times = 2),
                         y = c(10^(2:6), 0, 10^(1:4))),
       aes(x,y)) +
  geom_point() +
  # scale_y_continuous(trans = "log10") +
  scale_y_continuous(trans = scales::pseudo_log_trans(),
                     breaks = c(0, 10^(0:6)),
                     labels = scales::label_number_si()) +
  facet_wrap(~country, ncol = 1, scales = "free_y")

在此处输入图像描述

vs. with (trans = "log10") :

在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM