R: как да задам размера на контурен график с дефинирано от потребителя съотношение?

Опитвам се да начертая (запълнена) контурна карта със съотношение на страните = 1, но не успявам да получа правилната форма на прозореца за начертаване/ оставам с области в прозореца на начертаване, които са бели, защото прозорецът на начертаване (или полето) винаги остава квадрат. Моля, вижте примера по-долу

x <- 10*1:nrow(volcano)
y <- 10*1:ncol(volcano)
filled.contour (x, y, volcano, asp = 1)

води до диаграма, която изглежда така:filled.contour

как да се отърва от белите области в полето/прозореца за графика, като същевременно запазя съотношението на страните? Предполагам, че трябва някъде да задам размера на прозореца за графика, но не мога да разбера как; изглежда, че настройките на графичните параметри (използване на par) се презаписват от filled.contour (или чрез настройка на asp = 1)


person Lukas    schedule 15.08.2013    source източник
comment
С image вместо filled.contour можете да премахнете полето с axes=FALSE и да го добавите сами, не с box(), а с rect( min(x), min(y), max(x), max(y) ). Тъй като filled.contour използва layout и par, възстановяването на правилните координати става по-трудно.   -  person Vincent Zoonekynd    schedule 15.08.2013
comment
можете да зададете frame.plot на false и да изместите осите. вижте това r.789695.n4.nabble.com /Contour-Plot-Aspect-Ratio-td869340.html   -  person user2510479    schedule 15.08.2013
comment
Благодаря и на двамата. Но няма ли по-елегантен начин? Използването на решение 1 означава загуба на вашата легенда и rect() не замества осите (отметки, етикети и т.н.). С решение 2 губите текста на легендата и легендата все още е в оригиналния размер (височина) и е по-висока от действителния график.   -  person Lukas    schedule 15.08.2013


Отговори (2)


Изпитах същия проблем за мой проект. Разработих решение, като коригирах filled.contour()-функцията по начин, по който кутията се изчертава само около областта, където се наблюдават стойности. Освен това легендата е монтирана към коригираната кутия. Чрез прилагане на персонализираната функция filled.contourNew(), получавам следния график:

Графика с коригиран запълнен контур

filled.contourNew <- function (x = seq(0, 1, length.out = nrow(z)),
                                     y = seq(0, 1, length.out = ncol(z)), z, xlim = range(x, finite = TRUE),
                                     ylim = range(y, finite = TRUE), zlim = range(z, finite = TRUE),
                                     levels = pretty(zlim, nlevels), nlevels = 20,
                                     color.palette = cm.colors, col = color.palette(length(levels) - 1),
                                     plot.title, plot.axes, key.title, key.axes, asp = NA, xaxs = "i",
                                     yaxs = "i", las = 1, axes = TRUE, frame.plot = axes, ...)
        {
          if (missing(z)) {
            if (!missing(x)) {
              if (is.list(x)) {
                z <- x$z
                y <- x$y
                x <- x$x
              }
              else {
                z <- x
                x <- seq.int(0, 1, length.out = nrow(z))
              }
            }
            else stop("no 'z' matrix specified")
          }
          else if (is.list(x)) {
            y <- x$y
            x <- x$x
          }
          if (any(diff(x) <= 0) || any(diff(y) <= 0))
            stop("increasing 'x' and 'y' values expected")
          mar.orig <- (par.orig <- par(c("mar", "las", "mfrow")))$mar
          on.exit(par(par.orig))
          w <- (3 + mar.orig[2L]) * par("csi") * 2.54
          layout(matrix(c(2, 1), ncol = 2L), widths = c(1, lcm(w)))
          par(las = las)
          mar <- mar.orig
          mar[4L] <- mar[2L]
          mar[2L] <- 1
          par(mar = mar)
          pin1 <- par("pin")
          a = (pin1[1] + par("mai")[2] + par("mai")[4])
          b = (pin1[2] + par("mai")[1] + par("mai")[3])

          ratio <- abs(diff(ylim)) / abs(diff(xlim))

          ratioXY <- (a / b) * asp

          if (abs(diff(xlim)) / abs(diff(ylim)) >= ratioXY){

            par(plt = c(0.15, 0.5, 0.525 - ratio * ratioXY / 2 * 0.75,
                        0.525 + ratio * ratioXY / 2 * 0.75))
          }
          if (abs(diff(xlim)) / abs(diff(ylim)) < ratioXY){
            par(plt = c(0.15, 0.5, 0.15, 0.9))
          }
          plot.new()
          plot.window(xlim = c(0, 1), ylim = range(levels), xaxs = "i",
                      yaxs = "i")
          rect(0, levels[-length(levels)], 1, levels[-1L], col = col)
          if (missing(key.axes)) {
            if (axes)
              axis(4)
          }
          else key.axes
          box()
          if (!missing(key.title))
            key.title
          mar <- mar.orig
          mar[4L] <- 1
          par(mar = mar)
          #browser()
          a = (pin1[1] + par("mai")[2] + par("mai")[4])
          b = (pin1[2] + par("mai")[1] + par("mai")[3])

          ratio <- abs(diff(ylim)) / abs(diff(xlim))

          ratioXY <- (a / b) * asp
          if (abs(diff(xlim)) / abs(diff(ylim)) >= ratioXY){

            par(plt = c(0.15, 0.9, 0.525 - ratio * ratioXY / 2 * 0.75,
                        0.525 + ratio * ratioXY / 2 * 0.75))
          }
          if (abs(diff(xlim)) / abs(diff(ylim)) < ratioXY){
            par(plt = c(0.525 - 1 / ratioXY / 2 * 0.75 / ratio,
                        0.525 + 1 / ratioXY / 2 * 0.75 / ratio, 0.15, 0.9))
          }
          plot.new()
          plot.window(xlim, ylim, "", xaxs = xaxs, yaxs = yaxs, asp = asp)
          .filled.contour(x, y, z, levels, col)
          if (missing(plot.axes)) {
            if (axes) {
              title(main = "", xlab = "", ylab = "")
              Axis(x, side = 1)
              Axis(y, side = 2)
            }
          }
          else plot.axes
          if (frame.plot)
            box()
          if (missing(plot.title))
            title(...)
          else plot.title
          invisible()

        }
person Marcus Groß    schedule 14.06.2019

Опитайте тази

  x <- 10*1:nrow(volcano)
  y <- 10*1:ncol(volcano)
  filled.contour(x, y, volcano,asp=1, frame.plot=F,
  plot.axes = { axis(1, pretty(x,min=0), line=-4)
                axis(2, seq(0, 600, by = 100)) })
person user2510479    schedule 16.08.2013