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