R 使用ggplot2将x轴和y轴居中

R 使用ggplot2将x轴和y轴居中,r,ggplot2,R,Ggplot2,有没有一种方法可以像传统的图形计算器一样,将标签放在ggplot2绘图的中心来获取轴?我查看了文档,似乎没有该功能,但其他绘图软件包的图形自定义性不如ggplot2。为了澄清这一点,我希望从以下内容开始: 为此: 使用以下代码绘制第一个图: dat = data.frame(x = 1, y =1) p = ggplot(data = dat, aes(x=x, y=y)) + geom_point(size = 5) p + xlim(-2,2) + ylim(-2,2) 第二个情节是用

有没有一种方法可以像传统的图形计算器一样,将标签放在ggplot2绘图的中心来获取轴?我查看了文档,似乎没有该功能,但其他绘图软件包的图形自定义性不如ggplot2。为了澄清这一点,我希望从以下内容开始:

为此:

使用以下代码绘制第一个图:

dat = data.frame(x = 1, y =1)
p = ggplot(data = dat, aes(x=x, y=y)) + geom_point(size = 5)
p + xlim(-2,2) + ylim(-2,2)

第二个情节是用Mathematica绘制的。我遇到的主要问题是如何使带有标签的轴转到中心(我可以使主题空白,等等,没问题)。似乎没有可以编辑的主题参数来快速修复此问题。

我只会使用
xlim
ylim

dat = data.frame(x = 1, y =1)
p = ggplot(data = dat, aes(x=x, y=y)) + 
   geom_point(size = 5) + 
   xlim(-2, 2) + 
   ylim(-2, 2)
p

我只会使用
xlim
ylim

dat = data.frame(x = 1, y =1)
p = ggplot(data = dat, aes(x=x, y=y)) + 
   geom_point(size = 5) + 
   xlim(-2, 2) + 
   ylim(-2, 2)
p
第一近似值:

dat = data.frame(x = 1, y =1)
p = ggplot(data = dat, aes(x=x, y=y)) + theme_bw() +
  geom_point(size = 5) +
  geom_hline(yintercept = 0) +
  geom_vline(xintercept = 0)

根据SlowLeaner的回答调整限值。

一级近似值:

dat = data.frame(x = 1, y =1)
p = ggplot(data = dat, aes(x=x, y=y)) + theme_bw() +
  geom_point(size = 5) +
  geom_hline(yintercept = 0) +
  geom_vline(xintercept = 0)


根据SlowLeaner的回答调整限制。

我想这就是你想要的:

我构建了一个函数,它可以实现以下功能:

theme_geometry <- function(xvals, yvals, xgeo = 0, ygeo = 0, 
                           color = "black", size = 1, 
                           xlab = "x", ylab = "y",
                           ticks = 10,
                           textsize = 3,
                           xlimit = max(abs(xvals),abs(yvals)),
                           ylimit = max(abs(yvals),abs(xvals)),
                           epsilon = max(xlimit,ylimit)/50){

  #INPUT:
  #xvals .- Values of x that will be plotted
  #yvals .- Values of y that will be plotted
  #xgeo  .- x intercept value for y axis
  #ygeo  .- y intercept value for x axis
  #color .- Default color for axis
  #size  .- Line size for axis
  #xlab  .- Label for x axis
  #ylab  .- Label for y axis
  #ticks .- Number of ticks to add to plot in each axis
  #textsize .- Size of text for ticks
  #xlimit .- Limit value for x axis 
  #ylimit .- Limit value for y axis
  #epsilon .- Parameter for small space


  #Create axis 
  xaxis <- data.frame(x_ax = c(-xlimit, xlimit), y_ax = rep(ygeo,2))
  yaxis <- data.frame(x_ax = rep(xgeo, 2), y_ax = c(-ylimit, ylimit))

  #Add axis
  theme.list <- 
  list(
    theme_void(), #Empty the current theme
    geom_line(aes(x = x_ax, y = y_ax), color = color, size = size, data = xaxis),
    geom_line(aes(x = x_ax, y = y_ax), color = color, size = size, data = yaxis),
    annotate("text", x = xlimit + 2*epsilon, y = ygeo, label = xlab, size = 2*textsize),
    annotate("text", x = xgeo, y = ylimit + 4*epsilon, label = ylab, size = 2*textsize),
    xlim(-xlimit - 7*epsilon, xlimit + 7*epsilon), #Add limits to make it square
    ylim(-ylimit - 7*epsilon, ylimit + 7*epsilon)  #Add limits to make it square
  )

  #Add ticks programatically
  ticks_x <- round(seq(-xlimit, xlimit, length.out = ticks),2)
  ticks_y <- round(seq(-ylimit, ylimit, length.out = ticks),2)

  #Add ticks of x axis
  nlist <- length(theme.list)
  for (k in 1:ticks){

    #Create data frame for ticks in x axis
    xtick <- data.frame(xt = rep(ticks_x[k], 2), 
                        yt = c(xgeo + epsilon, xgeo - epsilon))

    #Create data frame for ticks in y axis
    ytick <- data.frame(xt = c(ygeo + epsilon, ygeo - epsilon), 
                        yt = rep(ticks_y[k], 2))

    #Add ticks to geom line for x axis
    theme.list[[nlist + 4*k-3]] <- geom_line(aes(x = xt, y = yt), 
                                         data = xtick, size = size, 
                                         color = color)

    #Add labels to the x-ticks
    theme.list[[nlist + 4*k-2]] <- annotate("text", 
                                            x = ticks_x[k], 
                                            y = ygeo - 2.5*epsilon,
                                            size = textsize,
                                            label = paste(ticks_x[k]))


    #Add ticks to geom line for y axis
    theme.list[[nlist + 4*k-1]] <- geom_line(aes(x = xt, y = yt), 
                                             data = ytick, size = size, 
                                             color = color)

    #Add labels to the y-ticks
    theme.list[[nlist + 4*k]] <- annotate("text", 
                                            x = xgeo - 2.5*epsilon, 
                                            y = ticks_y[k],
                                            size = textsize,
                                            label = paste(ticks_y[k]))
  }

  #Add theme
  #theme.list[[3]] <- 
  return(theme.list)
}

theme\u geometry我想这就是你想要的:

我构建了一个函数,它可以实现以下功能:

theme_geometry <- function(xvals, yvals, xgeo = 0, ygeo = 0, 
                           color = "black", size = 1, 
                           xlab = "x", ylab = "y",
                           ticks = 10,
                           textsize = 3,
                           xlimit = max(abs(xvals),abs(yvals)),
                           ylimit = max(abs(yvals),abs(xvals)),
                           epsilon = max(xlimit,ylimit)/50){

  #INPUT:
  #xvals .- Values of x that will be plotted
  #yvals .- Values of y that will be plotted
  #xgeo  .- x intercept value for y axis
  #ygeo  .- y intercept value for x axis
  #color .- Default color for axis
  #size  .- Line size for axis
  #xlab  .- Label for x axis
  #ylab  .- Label for y axis
  #ticks .- Number of ticks to add to plot in each axis
  #textsize .- Size of text for ticks
  #xlimit .- Limit value for x axis 
  #ylimit .- Limit value for y axis
  #epsilon .- Parameter for small space


  #Create axis 
  xaxis <- data.frame(x_ax = c(-xlimit, xlimit), y_ax = rep(ygeo,2))
  yaxis <- data.frame(x_ax = rep(xgeo, 2), y_ax = c(-ylimit, ylimit))

  #Add axis
  theme.list <- 
  list(
    theme_void(), #Empty the current theme
    geom_line(aes(x = x_ax, y = y_ax), color = color, size = size, data = xaxis),
    geom_line(aes(x = x_ax, y = y_ax), color = color, size = size, data = yaxis),
    annotate("text", x = xlimit + 2*epsilon, y = ygeo, label = xlab, size = 2*textsize),
    annotate("text", x = xgeo, y = ylimit + 4*epsilon, label = ylab, size = 2*textsize),
    xlim(-xlimit - 7*epsilon, xlimit + 7*epsilon), #Add limits to make it square
    ylim(-ylimit - 7*epsilon, ylimit + 7*epsilon)  #Add limits to make it square
  )

  #Add ticks programatically
  ticks_x <- round(seq(-xlimit, xlimit, length.out = ticks),2)
  ticks_y <- round(seq(-ylimit, ylimit, length.out = ticks),2)

  #Add ticks of x axis
  nlist <- length(theme.list)
  for (k in 1:ticks){

    #Create data frame for ticks in x axis
    xtick <- data.frame(xt = rep(ticks_x[k], 2), 
                        yt = c(xgeo + epsilon, xgeo - epsilon))

    #Create data frame for ticks in y axis
    ytick <- data.frame(xt = c(ygeo + epsilon, ygeo - epsilon), 
                        yt = rep(ticks_y[k], 2))

    #Add ticks to geom line for x axis
    theme.list[[nlist + 4*k-3]] <- geom_line(aes(x = xt, y = yt), 
                                         data = xtick, size = size, 
                                         color = color)

    #Add labels to the x-ticks
    theme.list[[nlist + 4*k-2]] <- annotate("text", 
                                            x = ticks_x[k], 
                                            y = ygeo - 2.5*epsilon,
                                            size = textsize,
                                            label = paste(ticks_x[k]))


    #Add ticks to geom line for y axis
    theme.list[[nlist + 4*k-1]] <- geom_line(aes(x = xt, y = yt), 
                                             data = ytick, size = size, 
                                             color = color)

    #Add labels to the y-ticks
    theme.list[[nlist + 4*k]] <- annotate("text", 
                                            x = xgeo - 2.5*epsilon, 
                                            y = ticks_y[k],
                                            size = textsize,
                                            label = paste(ticks_y[k]))
  }

  #Add theme
  #theme.list[[3]] <- 
  return(theme.list)
}

theme\u geometry还有一些其他有用的答案,但以下内容更接近目标视觉效果,避免了循环:

库(ggplot2)
图书馆(magrittr)
#常数

axis_begin还有一些其他有用的答案,但以下内容更接近目标视觉效果并避免循环:

库(ggplot2)
图书馆(magrittr)
#常数


axis\u begin你能提供一个显示你想要的输出的图像吗?@ialm我已经在一些澄清中添加了我很确定没有,但是我找不到一个明确说明你不能的来源。这感觉像是一个可以用
ggplot2::guides
,但轴心导板似乎比这更硬一些。如果你在一两天内没有得到答案,那么在谷歌群邮件列表上试试可能是值得的……三年多之后,仍然没有答案\你能提供一个显示你想要的输出的图像吗?@ialm我已经在一些澄清中添加了我很确定没有,但是我找不到一个明确说明你不能的来源。感觉这是一个可以用
ggplot2::guides
做的自然事情,但是轴指南似乎比这更硬一些。如果你在一两天内没有得到答案,那么在谷歌群邮件列表上试试可能是值得的……三年多之后,仍然没有答案\的确,这是一种使其居中的方法。但是似乎没有一种“模式”或者甚至是一种直接的方法来把中间的轴定位在中间,就像在Mathematica图中看到的那样。只是你已经不习惯了。这是R,不是Mathematica,我明白。我认为你不理解这个问题。起初我不知道如何让它更清楚,但现在我改变了图片和代码,所以,我希望,我的问题更清楚。这确实是一种让它集中的方法。但是似乎没有一种“模式”或者甚至是一种直接的方法来把中间的轴定位在中间,就像在Mathematica图中看到的那样。只是你已经不习惯了。这是R,不是Mathematica,我明白。我想你不明白这个问题。起初我不知道如何让它更清楚,但现在我已经更改了图片和代码,所以,我希望,我的问题更清楚。所以如果我想在线条上画轴标签,我就必须把它们画进去?@user2407894:是的,线条是纯线条,没有标签或记号。我想应该是yintercept=0和xintercept=0,所以如果我想在直线上画轴标签,我就必须把它们画进去?@user2407894:是的,直线是纯直线,没有标签或记号。我想应该是yintercept=0和xintercept=0