Удалите сетку, цвет фона, а также верхнюю и правую границы из 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/questions/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())
6 ответов:
EDIT игнорировать этот ответ. Теперь есть ответы получше. Смотрите комментарии. Используйте
+ theme_classic()
EDIT
это лучшая версия. Ошибка, упомянутая ниже в исходном сообщении, остается (я думаю). Но линия оси нарисована под панелью. Таким образом, удалить
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())
оригинальное сообщение Это уже близко. Там была ошибка с
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
крайние точки обрезаются, но обрезка может быть отменена с помощью кода по Батист.
gt <- ggplot_gtable(ggplot_build(p)) gt$layout$clip[gt$layout$name=="panel"] <- "off" grid.draw(gt)
или использовать
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)
последние обновления ggplot (0.9.2+) изменили синтаксис для тем. Прежде всего,
opts()
теперь устарел, будучи заменен наtheme()
. Сэнди!--5--> ответ будет по-прежнему (по состоянию на 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'))
выдает:
альтернатива
theme_classic()
это тема, которая поставляется с cowplot пакет,theme_cowplot()
(загружается автоматически вместе с пакетом). Он похож наtheme_classic()
, с несколькими тонкими различиями. Самое главное, что размеры меток по умолчанию больше, поэтому полученные цифры можно использовать в публикациях без дополнительных изменений (в частности, если вы сохраните их с помощьюsave_plot()
вместоggsave()
). Кроме того, фон прозрачный, а не белый, что может быть полезно, если вы хотите отредактировать рисунок в illustrator. Наконец, граненые сюжеты выглядят лучше, на мой взгляд.пример:
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
произведенный этим кодом выглядит так:отказ от ответственности: я автор пакета.
я следовал Эндрю, но я также должен был следовать https://stackoverflow.com/a/35833548 и установите оси 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))
упрощение из приведенного выше ответа Андрея приводит к этой ключевой теме для создания половины границы.
theme (panel.border = element_blank(), axis.line = element_line(color='black'))
указанные выше параметры не работают для карт, созданных с помощью
sf
иgeom_sf()
. Следовательно, я хочу добавить соответствующий здесь. Это создаст хорошую чистую карту, показывающую только объекты.library(sf) library(ggplot2) ggplot() + geom_sf(data = some_shp) + theme_minimal() + # white background theme(axis.text = element_blank(), # removing geographic coordinates axis.ticks = element_blank()) + # removing ticks coord_sf(ndiscr = 0) # remove grid in the background