can I separately control the x and y axes using gg

2020-02-23 08:00发布

Here is a ggplot from the ggplot wiki:

baseplot <- ggplot(data.frame(x=1:10, y=10:1)) +
    geom_point(aes(x = x, y = y))
baseplot

enter image description here

Question

Is it possible to control these axes separately, e.g. to make only the x-axis black? It does not appear that axis.line.x and axis.line.y are among the options.

What I have tried

  1. The wiki demonstrates that, e.g., it is possible to control the color of the axis

    baseplot + opts(axis.line = theme_segment(colour = 'black', size = 2))
    

    enter image description here

  2. using geom_segment works but has the limitation that the lines have to be matched to the plot numbers.

    Is there a way to get, e.g. the axis max and min and ticks from the baseplot object? That would reduce potential bugs. update the answer to this question, "no, not yet", was covered previously.

    baseplot + geom_segment(aes(x = c(0,0), y = c(0,0), 
                            yend = c(0, max(y)), xend = c(max(x), 0), 
                            size = c(0.5, 0.1))) + 
               geom_segment(aes(x = 0, y = y, 
                            xend = -1, 
                            yend = y, 
                            size = 0.1))
    

enter image description here

标签: r ggplot2
4条回答
劫难
2楼-- · 2020-02-23 08:20

It is not supported to control axis line separately. You can remove or edit the line after drawing:

> baseplot + opts(axis.line = theme_segment(colour = 'black', size = 2))
> grid.remove(gPath("axis_v", "axis.line.segments"), grep=TRUE)

> baseplot + opts(axis.line = theme_segment(colour = 'black', size = 2))
> grid.edit(gPath("axis_v", "axis.line.segments"), grep=TRUE, gp=gpar(col="red"))
> grid.edit(gPath("axis_h", "axis.line.segments"), grep=TRUE, gp=gpar(col="blue"))

UPDATED

In 0.9.1-, this may change like:

grid.edit(gPath("axis-l", "axis.line.segments"), grep=TRUE, gp=gpar(col="red"))
grid.edit(gPath("axis-b", "axis.line.segments"), grep=TRUE, gp=gpar(col="blue"))
查看更多
我命由我不由天
3楼-- · 2020-02-23 08:20

I suspect you are correct in your analysis.

However, there is one other potential workaround: geom_hline and geom_vline:

baseplot + 
    geom_hline(yintercept=0, colour="red", size = 3) +
    geom_vline(xintercept=0, colour="blue", size = 2) 

Again not ideal, since the lines span the entire plot area rather than just framing the axis, if you know what I mean.

enter image description here

查看更多
萌系小妹纸
4楼-- · 2020-02-23 08:34

It seems you can also achieve it easily by adapting a theme thusly:

mytheme <- theme_classic()
mytheme$axis.line.x <- mytheme$axis.line.y <- mytheme$axis.line
mytheme$axis.line.x$colour <- 'red'
ggplot(iris, aes(Sepal.Length, Sepal.Width)) + geom_point() + mytheme

enter image description here

查看更多
Juvenile、少年°
5楼-- · 2020-02-23 08:35

This issue points out that you can turn on both lines and then turn off one of them: https://github.com/hadley/ggplot2/issues/778. I found this strategy to be both simple and effective.

查看更多
登录 后发表回答