如何扩展ggplot y轴限制以包括最大值

时间:2018-11-29 05:07:40

标签: r ggplot2

通常在图中,Y轴值标签会在绘制的最大值以下被切掉。

For example:

library(tidyverse)
mtcars %>% ggplot(aes(x=mpg, y = hp))+geom_point()

我知道scale_y_continous-但我不知道执行此操作的明智方法。也许我只是在想什么。我不想弄乱自动生成的“智能”中断。

我可能会尝试手动进行操作...

  mtcars  %>% ggplot(aes(x=mpg, y=hp, color=as.factor(carb)))+geom_point()  + scale_y_continuous(limits = c(0,375))

enter image description here

但是,由于“智能中断”,因此无法像我上面提到的那样工作。无论如何,我是否需要将默认的中断间隔延长至1,因此在这种情况下将是400?当然,我希望它对于我正在使用的任何数据集都具有灵活性。

3 个答案:

答案 0 :(得分:4)

您可以使用expand_limits()来增加最大y轴值。您还可以确保将最大y轴值四舍五入到数据范围内的下一个最大值,例如,下一个最高的十个值,下一个最高的数百个值等,具体取决于是否为数据在数十,数百之内。

例如,下面的函数查找最大y值的以10为底的对数,并将其四舍五入。这为我们提供了最大y值的十进制刻度(例如,数十,数百,数千等)。然后将最大y轴值四舍五入到最接近最大十个值的十,一百等。

expandy = function(vec, ymin=NULL) {

  max.val = max(vec, na.rm=TRUE)
  min.log = floor(log10(max.val))

  expand_limits(y=c(ymin, ceiling(max.val/10^min.log)*10^min.log))
}

p = mtcars %>% ggplot(aes(x=mpg, y = hp)) +
  geom_point()

p + expandy(mtcars$hp)

p + expandy(mtcars$hp, 0)

或者,为使操作更简单,您可以设置函数,以便直接从绘图中收集y范围数据:

library(gridExtra)

expandy = function(plot, ymin=0) {

  max.y = max(layer_data(plot)$y, na.rm=TRUE)
  min.log = floor(log10(max.y))

  expand_limits(y=c(ymin, ceiling(max.y/10^min.log)*10^min.log))
}

p = mtcars %>% ggplot(aes(x=mpg, y = hp)) +
  geom_point()

grid.arrange(p, p + expandy(p), ncol=2)

enter image description here

p = iris %>% ggplot(aes(x=Sepal.Width, y=Petal.Width)) +
  geom_point()

grid.arrange(p, p + expandy(p), ncol=2)

enter image description here

答案 1 :(得分:0)

选择断开y轴的步骤,您可以使用ceiling()函数

library(gridExtra)

p1 <- mtcars %>% ggplot(aes(x=mpg, y = hp)) + geom_point() 

p2 <- p1 +
  scale_y_continuous(
    limits = c(0, ceiling(max(mtcars$hp)/50)*50), 
    breaks = seq(0, ceiling(max(mtcars$hp)/50)*50, 50)
  ) 

p3 <- p1 + scale_y_continuous(
  limits = c(0, ceiling(max(mtcars$hp)/100)*100), 
  breaks = seq(0, ceiling(max(mtcars$hp)/100)*100, 100)
) 

grid.arrange(p1, p2, p3, ncol=3)

对于p2,Ste是50,而对于p3,步是100

enter image description here

答案 2 :(得分:0)

以下是允许使用任何数字刻度的解决方案:

@model BSS_IT_Education.Models.FormationFormViewModel

@{ 
    ViewBag.Title = "Formation";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@using (Html.BeginForm("Save", "Formations"))
{
    @Html.AntiForgeryToken()
    @Html.HiddenFor(model => model.FormationDTO.Id)

    <div class="form-horizontal">

        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <div class="form-group">
            @Html.LabelFor(model => model.FormationDTO.Name, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-4">
                @Html.EditorFor(model => model.FormationDTO.Name, new { htmlAttributes = new { @class = "form-control", @placeholder = "Entrez le nom de la formation..." } })
                @Html.ValidationMessageFor(model => model.FormationDTO.Name, "", new { @class = "text-danger" })
            </div>
        </div>

        // BUNCH OF OTHERS FORM-GROUPS

        <div class="form-group">
            <div class="col-md-offset-2 col-md-8">
                <button type="submit" class="btn btn-success">@((Model.FormationDTO.Id == 0) ? "Sauvegarder  " : "Modifier")</button>                
            </div>
        </div>
    </div>
}