Удаление произвольной линии сетки, но с сохранением соответствующей отметки в ggplot2 - PullRequest
5 голосов
/ 06 февраля 2020

Допустим, у меня есть график, сгенерированный этим кодом:

library(ggplot2); ggplot(diamonds, aes(x=carat, y=price, color=cut)) + geom_point()

Я хотел бы удалить произвольную горизонтальную (или вертикальную) линию сетки, возможно, v = 12500 или v = 15000 (или оба). Кроме того, я хотел бы сохранить соответствующие отметки. Есть ли какой-нибудь относительно простой способ сделать это?

Для ясности я не хочу избавиться от всех незначительных линий сетки , особенно не всех линий сетки .

1 Ответ

5 голосов
/ 06 февраля 2020

Вы можете попробовать что-то подобное, не используя сетку для изменения базового объекта.

Сначала мы получаем координаты мажор / минор

ymajor = ggplot_build(p)$layout$panel_params[[1]]$y.major_source
yminor = ggplot_build(p)$layout$panel_params[[1]]$y.minor_source
yminor = setdiff(yminor,ymajor)

ymajor_cols = ifelse(ymajor == 15000,"transparent","white")
yminor_cols = ifelse(yminor == 12500,"transparent","white")

Затем мы добавляем к вашему заговор, указав

ggplot(diamonds, aes(x=carat, y=price, color=cut)) + geom_point()+
theme(panel.grid.major.y  = element_line(colour = ymajor_cols),
panel.grid.minor.y  = element_line(colour = yminor_cols))

enter image description here

Я бы на самом деле предпочел указать основные и второстепенные разрывы и указать их на графике, приведенный ниже код дает то же самое результаты:

ymajor = c(0,5000,10000,15000)
yminor = c(0,2500,12500,17500)
ymajor_cols = ifelse(ymajor == 15000,"transparent","white")
yminor_cols = ifelse(yminor == 12500,"transparent","white")

ggplot(diamonds, aes(x=carat, y=price, color=cut)) + geom_point()+
scale_y_continuous(breaks=ymajor,minor_breaks = yminor)+
theme(panel.grid.major.y  = element_line(colour = ymajor_cols),
panel.grid.minor.y  = element_line(colour = yminor_cols))
...