ggplot2:自动缩放以包含geom_density_2d中的完整轮廓线

Ben*_*oss 2 r scale contour ggplot2

希望这会很快.

我使用ggplot绘制了下面的图表.

ggplot图表

用代码:

ggplot(ContourDummy,aes(x=Measure.Name1,y=Measure.Name2,colour=Category.Name))
+geom_density_2d()
Run Code Online (Sandbox Code Playgroud)

我的问题是一些轮廓线不完整.

现在,如果我通过添加以下内容来缩放我的轴...

+ scale_x_continuous(minor_breaks=0, breaks=seq(14,26,12),limits=c(14,26)) 
+ scale_y_continuous(minor_breaks=0, breaks=seq(50,100,50),limits=c(50,100)
Run Code Online (Sandbox Code Playgroud)

我得到了所需的输出.

但有没有办法自动设定限制?我希望能够通过切换数据源,x,y和颜色自动复制此图表类型.

我不是特别想每次都在摆弄尺度.

eip*_*i10 5

这是一个扩展x和y范围的函数,包括密度等值线的最大范围.该功能的工作原理如下:

  1. 创建一个绘图对象,其x和y范围扩展到数据范围之外,这样我们就可以确定绘图将包含完整的轮廓线.

  2. 使用ggplot_build以确定所有密度轮廓之间的最小和最大x和y值.

  3. 将图的x和y范围设置为步骤2中确定的最小和最大x和y值.

exp参数用于将最终范围扩展一小部分(默认为1%),因为在没有那么少的额外填充的情况下仍然可以切断一小段轮廓线(在下面的示例中,尝试绘制mtcars数据帧exp=0你会明白我的意思.

d2d = function(data, var1, var2, col, exp=0.005) {

  # If the colour variable is numeric, convert to factor
  if(is.numeric(data[,col])) {
    data[,col] = as.factor(data[,col])
  }

  # Create plot, but expand x and y ranges well beyond data
  p=ggplot(data, aes_string(var1, var2, colour=col)) +
    geom_density_2d() +
    scale_x_continuous(limits=c(min(data[,var1]) - 2*diff(range(data[,var1])),
                                max(data[,var1]) + 2*diff(range(data[,var1])))) +
    scale_y_continuous(limits=c(min(data[,var2]) - 2*diff(range(data[,var2])),
                                max(data[,var2]) + 2*diff(range(data[,var2]))))

  # Get min and max x and y values among all density contours
  pb = ggplot_build(p)

  xyscales = lapply(pb$data[[1]][,c("x","y")], function(var) {
    rng = range(var)
    rng + c(-exp*diff(rng), exp*diff(rng))
  })

  # Set x and y ranges to include complete density contours
  ggplot(data, aes_string(var1, var2, colour=col)) +
    geom_density_2d() +
    scale_x_continuous(limits=xyscales[[1]]) +
    scale_y_continuous(limits=xyscales[[2]]) 
}
Run Code Online (Sandbox Code Playgroud)

在两个内置数据集上试用该函数:

d2d(mtcars, "wt","mpg", "cyl")
d2d(iris, "Petal.Width", "Petal.Length", "Species")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

以下是使用默认x和y范围的图表:

ggplot(mtcars, aes(wt, mpg, colour=factor(cyl))) + geom_density_2d()

ggplot(iris, aes(Petal.Width, Petal.Length, colour=Species)) + geom_density_2d()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果你想控制轴刻度线的数量,你可以做一些像这样的事情:

d2d = function(data, var1, var2, col, nx=5, ny=5, exp=0.01) {

  require(scales)

  # If the colour variable is numeric, convert to factor
  if(is.numeric(data[,col])) {
    data[,col] = as.factor(data[,col])
  }

  # Create plot, but expand x and y ranges well beyond data
  p=ggplot(data, aes_string(var1, var2, colour=col)) +
    geom_density_2d() +
    scale_x_continuous(limits=c(min(data[,var1]) - 2*diff(range(data[,var1])),
                                max(data[,var1]) + 2*diff(range(data[,var1])))) +
    scale_y_continuous(limits=c(min(data[,var2]) - 2*diff(range(data[,var2])),
                                max(data[,var2]) + 2*diff(range(data[,var2]))))

  # Get min and max x and y values among all density curves
  pb = ggplot_build(p)

  xyscales = lapply(pb$data[[1]][,c("x","y")], function(var) {
    rng = range(var)
    rng + c(-exp*diff(rng), exp*diff(rng))
  })

  # Set x and y ranges to include all of outer density curves
  ggplot(data, aes_string(var1, var2, colour=col)) +
    geom_density_2d() +
    scale_x_continuous(limits=xyscales[[1]], breaks=pretty_breaks(n=nx)) +
    scale_y_continuous(limits=xyscales[[2]], breaks=pretty_breaks(n=ny)) 
}
Run Code Online (Sandbox Code Playgroud)