Ylim max通过变量动态更改,而R中的min设置为0

时间:2019-06-01 17:18:33

标签: r ggplot2

我希望图形从y = 0开始,但是我希望最大值随着数据的倍数而变化,或者以其他方式动态缩小。我在这组图表中有34个ymax。

我尝试过scale_y_continuouscoord_cartesian,但是当我尝试放入expand = expand_scale(mult = 2)来使我的最大值动态变化时,但是图开始从负数开始,我希望它们从0开始。

title<- c( 
  "Carangidae",
  "Atlantic cutlassfish",
  "Lizardfish",
  "Sharks",
  "Mackerel")
#DATA#
biomass<- structure(list(timestep = structure(c(10957, 10988, 11017, 11048, 
11078, 11109, 11139, 11170, 11201, 11231, 11262, 11292), class = "Date"), 
    bio_pre_Carangidae = c(0.01105, 0.0199, 0.017, 
    0.01018, 0.0119, 0.0101, 0.009874, 0.009507, 
    0.009019, 0.00843, 0.00841, 0.00805), bio_obs_Carangidae = c(NA, 
    NA, NA, NA, NA, 0.00239, NA, NA, NA, NA, NA, NA), bio_pre_Atl_cutlassfish = c(0.078, 
    0.069, 0.067, 0.06872, 0.0729, 0.0769, 
    0.0775, 0.075, 0.0743, 0.072, 0.071, 
    0.069), bio_obs_Atl_cutlassfish = c(NA, NA, NA, NA, NA, 
    0.0325, NA, NA, NA, NA, NA, NA), bio_pre_lizardfish = c(0.0635, 
    0.062, 0.057, 0.0536, 0.0505, 0.0604, 
    0.0627, 0.068, 0.0695, 0.066, 0.0623, 
    0.0598), bio_obs_lizardfish = c(NA, NA, NA, NA, NA, 0.037, 
    NA, NA, NA, NA, NA, NA), bio_pre_sharks = c(0.025, 0.0155, 
    0.0148, 0.0135, 0.01379, 0.01398, 0.014, 
    0.0139, 0.0136, 0.0132, 0.0126, 0.011), 
    bio_obs_sharks = c(NA, NA, NA, NA, NA, 0.003, NA, NA, 
    NA, NA, NA, NA), bio_pre_mackerel = c(0.0567, 0.0459, 
    0.0384, 0.03, 0.0328, 0.0336, 0.0299, 
    0.0296, 0.02343, 0.02713, 0.0239, 0.019
    ), bio_obs_mackerel = c(NA, NA, NA, NA, NA, 0.055, NA, 
    NA, NA, NA, NA, NA)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -12L))

这是我的功能:

function (biomass, .var1, .var2, .var3) {
    p <- ggplot(biomass, aes(x = timestep)) + 
geom_line(aes(y = .data[[.var1]], linetype = "Predicted")) + geom_point(size = 3, aes(y = .data[[.var2]], shape = "Observed")) + 
ggtitle(paste0(.var3)) + 
ylab(expression("biomass" ~ (t/km^2))) + 
theme_classic() + 
scale_y_continuous(limits = c(0, NA), expand = expand_scale(mult = 2))+

  ###This is the portion where I cannot figure out how to set ymin = 0 and then ymax to 2* the maximum value of a dataset.##

theme(legend.position = "right") + 
theme(axis.ticks = element_line(size = 1), axis.ticks.length = unit(0.25, "cm"))
    return(p)
} 


## create two separate name vectors
var1_names <- colnames(biomass)[grepl("^bio_pre", colnames(biomass))]
var2_names <- colnames(biomass)[grepl("^bio_obs", colnames(biomass))]
var3_names <- title

## loop through two vectors simultaneously and save result in a list 
# ..1 = var1_names, ..2 = var2_names
my_plot_b <- pmap(list(var1_names, var2_names, var3_names), ~ my_bio_plot(biomass, ..1, ..2, ..3))

## merge plots together
# https://cran.r-project.org/web/packages/cowplot/
# install.packages("cowplot", dependencies = TRUE)
dev.new(title = "Model Fit Biomass",
        width = 12,
        height = 6,
        noRStudioGD = TRUE
)
print(my_plot_b)

我可以设法同时设置ymin = 0(a)或动态ymax(b),但无法同时获得两者。

a

enter image description here

b

enter image description here

2 个答案:

答案 0 :(得分:0)

这个怎么样?似乎可以处理您的数据。

在函数顶部定义每个图表的最大值:

my_bio_plot <-  function (biomass, .var1, .var2, .var3) {
  max_y = 2.0 * max(biomass[[.var1]]) 
  ...
  scale_y_continuous(limits = c(0, max_y)) +
  ...

这似乎创建了请求的输出,数据中的y y = 0且max y = 2 * max y。

enter image description here

答案 1 :(得分:0)

已更新,以添加与您的方法完全不同的方法:

biomass %>% 
  gather(species, bio, -timestep) %>% 
  mutate(type = ifelse(stringr::str_detect(species, 'pre'), 'predicted', 'observed'),
         species = gsub(".*_", "", species)) %>% 
  group_by(species) %>% 
  mutate(ul = max(bio, na.rm = TRUE) * 2) %>% 
  filter(species == "sharks") -> df

df %>% 
  ggplot(aes(timestep, bio, group = type)) + 
  geom_point(aes(shape = type)) + 
  geom_line(aes(linetype = type)) +
  # facet_wrap(~species) +
  scale_linetype_manual(name = "", 
                        values = c("blank", 'solid')) +
  scale_shape_manual(name = "", 
                        values = c(19, NA))+
  scale_y_continuous(limits = c(0, max(df$ul)))

您可以删除filter(species == "sharks") and uncomment the facet_wrap(〜species),并同时绘制所有物种。