Remova a grade, a cor de fundo e as bordas superior e direita de ggplot2

Eu gostaria de reproduzir o gráfico imediatamente abaixo usando ggplot2. Eu posso chegar perto, mas não consigo remover as bordas superior e direita. Abaixo eu apresento várias tentativas usando ggplot2, incluindo várias sugestões encontradas em ou via Stackoverflow. Infelizmente, não consegui fazer com que essas sugestões funcionassem.

Espero que alguém consiga corrigir um ou mais trechos de código abaixo.

Obrigado por qualquer sugestão.

# 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()) 

EDITAR Ignorar esta resposta. Agora há melhores respostas. Veja os comentários. Use + theme_classic()

EDITAR

Esta é uma versão melhor. O bug mencionado abaixo no post original permanece (eu acho). Mas a linha do eixo é desenhada sob o painel. Portanto, remova o panel.border e o panel.background para ver as linhas do eixo.

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

insira a descrição da imagem aqui

Post original Isso fica perto. Houve um erro com axis.line não funcionando no eixo y ( veja aqui ), que parece não estar corrigido ainda. Portanto, após remover a borda do painel, o eixo y deve ser desenhado separadamente usando 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 

Os pontos extremos são cortados, mas o recorte pode ser desfeito usando código por baptiste .

 gt <- ggplot_gtable(ggplot_build(p)) gt$layout$clip[gt$layout$name=="panel"] <- "off" grid.draw(gt) 

insira a descrição da imagem aqui

Ou use limits para mover os limites do painel.

 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) 

Atualizações recentes do ggplot (0.9.2+) revisaram a syntax dos temas. Mais notavelmente, opts() agora está obsoleto, tendo sido substituído por theme() . A resposta de Sandy ainda (a partir de janeiro ’12) gera um gráfico, mas faz R lançar um monte de avisos.

Aqui está o código atualizado refletindo a syntax atual do 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')) 

gera:

saída de plotagem

Uma alternativa para theme_classic() é o tema que vem com o pacote theme_cowplot() , theme_cowplot() (carregado automaticamente com o pacote). Parece semelhante a theme_classic() , com algumas diferenças sutis. Mais importante ainda, os tamanhos de etiqueta padrão são maiores, portanto os números resultantes podem ser usados ​​em publicações sem modificações adicionais necessárias (em particular se você salvá-las com save_plot() vez de ggsave() ). Além disso, o plano de fundo é transparente, não branco, o que pode ser útil se você quiser editar a figura no illustrator. Finalmente, os charts facetados parecem melhores, na minha opinião.

Exemplo:

 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 

Isto é o que o arquivo plot.png produzido por este código se parece com: insira a descrição da imagem aqui

Disclaimer: Eu sou o autor do pacote.

Segui a resposta de Andrew , mas também tive que seguir https://stackoverflow.com/a/35833548 e definir os eixos xe y separadamente devido a um erro na minha versão do ggplot (v2.1.0).

Ao invés de

 theme(axis.line = element_line(color = 'black')) 

eu usei

 theme(axis.line.x = element_line(color="black", size = 2), axis.line.y = element_line(color="black", size = 2)) 

Simplificação da resposta acima Andrew leva a este tema chave para gerar a meia fronteira.

 theme (panel.border = element_blank(), axis.line = element_line(color='black'))