Подтвердить что ты не робот

Могу ли я отдельно управлять осями x и y с помощью ggplot?

Вот ggplot из ggplot wiki:

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

enter image description here

Вопрос

Можно ли управлять этими осями отдельно, например. сделать только ось х черным? Похоже, что axis.line.x и axis.line.y относятся к числу опций.

Что я пробовал

  • Вики демонстрируют, что, например, можно управлять цветом оси

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

    enter image description here

  • с помощью geom_segment работает, но имеет ограничение на то, что строки должны быть сопоставлены с номерами сюжетов.

    Есть ли способ получить, например. ось max и min и тики от объекта baseplot? Это уменьшит потенциальные ошибки. обновить ответ на этот вопрос, "нет, еще нет", был ранее закрыт .

    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

4b9b3361

Ответ 1

Кажется, вы также можете легко достичь этого, адаптировав тему:

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

Ответ 2

Не поддерживается управление осью линии отдельно. Вы можете удалить или отредактировать строку после рисования:

> 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"))

ОБНОВЛЕНО

В 0.9.1- это может измениться следующим образом:

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

Я подозреваю, что вы правы в своем анализе.

Однако существует еще одно потенциальное обходное решение: geom_hline и geom_vline:

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

Опять не идеальный, так как линии охватывают всю область графика, а не просто обрамляют ось, если вы знаете, что я имею в виду.

enter image description here

Ответ 4

В этой статье указывается, что вы можете включить обе строки, а затем отключить одну из них: https://github.com/hadley/ggplot2/issues/778. Я нашел эту стратегию простой и эффективной.