R 使用ggplot2将x轴和y轴居中
有没有一种方法可以像传统的图形计算器一样,将标签放在ggplot2绘图的中心来获取轴?我查看了文档,似乎没有该功能,但其他绘图软件包的图形自定义性不如ggplot2。为了澄清这一点,我希望从以下内容开始: 为此: 使用以下代码绘制第一个图: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) 第二个情节是用
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