Удалите сетку, цвет фона и верхнюю и правую границы от ggplot2
Я хотел бы воспроизвести сюжет сразу же, используя ggplot2. Я могу приблизиться, но не могу удалить верхнюю и правую границы. Ниже я предлагаю несколько попыток с использованием ggplot2, включая несколько предложений, найденных в или через Stackoverflow. К сожалению, я не смог заставить эти предложения работать.
Я надеюсь, что кто-то сможет исправить один или несколько фрагментов кода ниже.
Спасибо за любые предложения.
# desired plot
a <- seq(1,20)
b <- a^0.25
plot(a,b, bty = "l")
library(ggplot2)
df <- as.data.frame(cbind(a,b))
# 1. ggplot2 default
ggplot(df, aes(x = a, y = b)) + geom_point()
# 2. removes background color
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black'))
# 3. also removes gridlines
none <- theme_blank()
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none)
# 4. does not remove top and right border
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(panel.border = none)
# 5. does not remove top and right border
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(axis.line = theme_segment())
# 6. removes x and y axis in addition to top and right border
# http://stackoverflow.com/info/5458409/remove-top-and-right-border-from-ggplot2
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(panel.background=theme_rect(colour=NA))
# 7. returns error when attempting to remove top and right border
# https://groups.google.com/group/ggplot2/browse_thread/thread/f998d113638bf251
#
# Error in el(...) : could not find function "polylineGrob"
#
theme_L_border <- function(colour = "black", size = 1, linetype = 1) {
structure(
function(x = 0, y = 0, width = 1, height = 1, ...) {
polylineGrob(
x=c(x+width, x, x), y=c(y,y,y+height), ..., default.units = "npc",
gp=gpar(lwd=size, col=colour, lty=linetype),
)
},
class = "theme",
type = "box",
call = match.call()
)
}
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts( panel.border = theme_L_border())
Ответы
Ответ 1
ИЗМЕНИТЬ Игнорировать этот ответ. Теперь есть лучшие ответы. См. Комментарии. Используйте + theme_classic()
ИЗМЕНИТЬ
Это лучшая версия. Ошибка, упомянутая ниже в исходном посте, остается (я думаю). Но линия оси рисуется под панелью. Поэтому удалите оба panel.border
и panel.background
, чтобы увидеть оси.
library(ggplot2)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))
ggplot(df, aes(x = a, y = b)) + geom_point() +
theme_bw() +
theme(axis.line = element_line(colour = "black"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
panel.background = element_blank())
![enter image description here]()
Оригинальное сообщение
Это приближается. Была ошибка с axis.line
не работающим по оси y (см. Здесь), которая пока еще не исправлена. Поэтому, после удаления границы панели, ось y должна быть проведена отдельно, используя geom_vline
.
library(ggplot2)
library(grid)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))
p = ggplot(df, aes(x = a, y = b)) + geom_point() +
scale_y_continuous(expand = c(0,0)) +
scale_x_continuous(expand = c(0,0)) +
theme_bw() +
opts(axis.line = theme_segment(colour = "black"),
panel.grid.major = theme_blank(),
panel.grid.minor = theme_blank(),
panel.border = theme_blank()) +
geom_vline(xintercept = 0)
p
Крайние точки обрезаны, но отсечение можно отменить с помощью кода baptiste.
gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name=="panel"] <- "off"
grid.draw(gt)
![enter image description here]()
Или используйте limits
для перемещения границ панели.
ggplot(df, aes(x = a, y = b)) + geom_point() +
xlim(0,22) + ylim(.95, 2.1) +
scale_x_continuous(expand = c(0,0), limits = c(0,22)) +
scale_y_continuous(expand = c(0,0), limits = c(.95, 2.2)) +
theme_bw() +
opts(axis.line = theme_segment(colour = "black"),
panel.grid.major = theme_blank(),
panel.grid.minor = theme_blank(),
panel.border = theme_blank()) +
geom_vline(xintercept = 0)
Ответ 2
Недавние обновления ggplot (0.9.2+) переработали синтаксис тем. В частности, opts()
теперь устарел, заменив его на theme()
. Ответ Sandy будет по-прежнему (по состоянию на январь 12) создает диаграмму, но заставляет R бросить кучу предупреждений.
Здесь обновленный код, отражающий текущий синтаксис ggplot:
library(ggplot2)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))
#base ggplot object
p <- ggplot(df, aes(x = a, y = b))
p +
#plots the points
geom_point() +
#theme with white background
theme_bw() +
#eliminates background, gridlines, and chart border
theme(
plot.background = element_blank()
,panel.grid.major = element_blank()
,panel.grid.minor = element_blank()
,panel.border = element_blank()
) +
#draws x and y axis line
theme(axis.line = element_line(color = 'black'))
генерирует:
![plot output]()
Ответ 3
Альтернативой theme_classic()
является тема, которая поставляется с пакетом cowplot, theme_cowplot()
(автоматически загружается с пакетом). Он похож на theme_classic()
, с несколькими незначительными отличиями. Самое главное, размеры меток по умолчанию больше, поэтому полученные цифры могут быть использованы в публикациях без дополнительных изменений (в частности, если вы сохраните их с помощью save_plot()
вместо ggsave()
). Кроме того, фон прозрачный, а не белый, что может быть полезно, если вы хотите отредактировать фигуру в иллюстраторе. Наконец, грандиозные сюжеты выглядят лучше, на мой взгляд.
Пример:
library(cowplot)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))
p <- ggplot(df, aes(x = a, y = b)) + geom_point()
save_plot('plot.png', p) # alternative to ggsave, with default settings that work well with the theme
Это то, что созданный этим кодом файл plot.png
выглядит так:
![enter image description here]()
Отказ от ответственности: я автор пакетов.
Ответ 4
Я последовал за Andrew answer, но мне также пришлось следовать fooobar.com/info/85119/... и установить x и y отдельно из-за ошибки в моей версии ggplot (v2.1.0).
Вместо
theme(axis.line = element_line(color = 'black'))
Я использовал
theme(axis.line.x = element_line(color="black", size = 2),
axis.line.y = element_line(color="black", size = 2))