在 R 的 plot.default 函数中,x 轴太短。

3

我的x轴太短了。

我的图表

d <- data.frame(x = c(120,200,300), y = rep(1,3))

 plot(d$x, 
      d$y,
      xlim = c(min(d$x), max(d$x)),
      axes = FALSE,
      xlab = "",
      ylab = "")

axis(1, lwd = 2)

显然,这并不理想。我知道有许多方案可以绘制单个实例的图形。但是,我正在以编程方式生成许多具有不同x值的这样的图形。因此,我需要一个通用的解决方案,并且直接适用于不同的x值。

以下是一些头脑风暴的代码:

 #This works but the tick marks are ugly.  I also can't control lwd of axis
 plot(d$x, 
      d$y,
      yaxt="n",
      frame.plot = FALSE,
      xlab = "",
      ylab = "",
      xaxp = c(120, 300, 50)) 

 #this is the solution for this particular case, however, it would not work in general
 plot(d$x, 
      d$y,
      xlim = c(min(d$x)-20, max(d$x)),
      axes = FALSE,
      xlab = "",
      ylab = "")

axis(1, lwd = 2)    

有什么想法吗?


我也不能控制轴线的lwd吗?你确定吗?这是一个非常笼统的说法。你尝试过在axis中使用lwd吗?由于你只提供了一个例子,我只能向你提供这个:with(d, plot(x, y, axes = FALSE, ann = FALSE)); axis(1, at = pretty(range(d$x)), lwd = 0, lwd.ticks = 1) 不确定这在一般情况下对你如何有效。 - rawr
2个回答

2
这里提供一种使用基本的R语言绘图方法。其逻辑与ggplot2相似。以下代码将x轴范围设定为数据范围下方和上方最接近50的倍数,并在每个50的倍数处放置刻度线。如果您想根据不同图形数据的范围动态地改变这些参数,可以添加更复杂的逻辑。 xfun计算最小和最大的x轴限制。 tick.dist设置我们希望在图表中刻度之间的距离。默认设置为50。因此,默认情况下,当which="min"时,xfun返回小于value的最大50的倍数。当which="max"时,xfun返回大于value的最大50的倍数。
xfun = function(value, which, tick.dist=50) {

  # Calculate minimum x-limit
  if(which=="min") {
    return(value - value %% tick.dist)
  }

  # Calculate maximum x-limit
  if(which=="max") {
    return(value + (tick.dist - value %% tick.dist))
  }
}

现在我们创建四个样本图。

par(mfrow=c(2,2))

# Try out various ranges for the x-values
x_vals = c(-23, 56, 80, 123)

# Set distance between tick marks
tick.dist=50

for (i in 1:length(x_vals)) {
  # Create fake data
  d <- data.frame(x=runif(10, x_vals[i], x_vals[i] + 220), y = rep(3,10))  

  # Set x limits and number of tick marks
  xmin = xfun(min(d$x), "min", tick.dist) 
  xmax = xfun(max(d$x), "max", tick.dist) 
  nticks = as.integer((xmax - xmin)/tick.dist)

  # Plot
  plot(d$x, d$y, xaxt="n", yaxt="n", frame.plot = FALSE,
       xlab = "", ylab = "", xlim=c(xmin, xmax)) 

  # xaxp controls location of min and max x-axis tick marks
  #  as well as the total number of tick marks. 
  #  See ?par("xaxp") for more info.
  axis(1, lwd = 2, xaxp = c(xmin, xmax, nticks))
}

enter image description here


1
这里有一个选项,使用ggplot2进行绘图。下面的代码将x轴范围设置为数据范围下方和上方最接近50的倍数,并在每个50的倍数处放置刻度标记。如果您想根据不同绘图的数据范围动态地改变其中任何一个,请添加更复杂的逻辑。请保留html标签。
library(ggplot2)
library(gridExtra)  # For grid.arrange function

xfun函数用于计算x轴的最小和最大限制。 tick.dist函数设置图表中刻度线之间的距离。默认距离为50。因此,默认情况下,当which="min"时,xfun返回小于value的最大50的倍数。当which="max"时,xfun返回大于value的最小50的倍数。

xfun = function(value, which, tick.dist=50) {

  # Calculate lower x-limit
  if(which=="min") {
    return(value - value %% tick.dist)
  }

  # Calculate upper x-limit
  if(which=="max") {
    return(value + (tick.dist - value %% tick.dist))
  }
}

现在我们创建一个自定义主题,仅绘制点标记和x轴:
my_theme = list(theme_bw(),
                theme(panel.border=element_blank(), 
                      axis.line=element_line(), 
                      axis.line.y=element_blank(),
                      panel.grid.major=element_blank(),
                      panel.grid.minor=element_blank(),
                      axis.ticks.y=element_blank(),
                      axis.text.y=element_blank()),
                labs(y="",x=""))

现在我们为四组不同的x值创建图表,使用xfun设置x轴限制。
# Try out various ranges for the x-values
x_vals = c(-23, 56, 80, 123)

# Set distance between ticks and x-axis padding
tick.dist=50
pad = 5

# List to store the plots
p.list=list()

# Create a plot for each element of x_vals
for (i in 1:length(x_vals)) {

  # Create fake data
  d <- data.frame(x=runif(10, x_vals[i], x_vals[i] + 220), y = rep(3,10))  

  # Set x limits
  xmin = xfun(min(d$x), "min", tick.dist) 
  xmax = xfun(max(d$x), "max", tick.dist) 

  # Plot
  p.list[[i]] = ggplot(d, aes(x,y)) +
    geom_point() +
    # Set the exact x-axis range
    coord_cartesian(xlim=c(xmin - pad, xmax + pad)) + 
    # Set major tick values
    scale_x_continuous(breaks=seq(-1000,1000, tick.dist)) +
    my_theme
}

# Plot all the graphs on a single "page"
do.call(grid.arrange, p.list)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接