Salvando gráficos R entre sistemas operacionais

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


[Esteartigofoipublicadopelaprimeiravezem[Thisarticlewasfirstpublishedon r – Rios saltando, e gentilmente contribuiu para os R-blogueiros]. (Você pode relatar um problema sobre o conteúdo desta página aqui)


Deseja compartilhar seu conteúdo com R-blogueiros? clique aqui se você tiver um blog ou aqui se não tiver.

R é conhecido por seus gráficos incríveis. Não somente ggplot2, mas também conspiradore as outras dezenas de pacotes na exibição de tarefas gráficas. Parece haver um gráfico para cada cenário. No entanto, depois de criar sua figura, como você a exporta? Esta postagem compara métodos padrão para exportar plotagens R como PNGs / PDFs em diferentes sistemas operacionais. Como o R possui excelentes recursos entre plataformas, podemos esperar que isso ocorra até a exportação de gráficos. Mas, como veremos, não é esse o caso!

Salvando gráficos

Suponha que criamos um simples ggplot2 gráfico de dispersão

library("ggplot2")
g = ggplot(mtcars, aes(disp, mpg)) + 
  geom_point()

Mas, uma vez criado, como você salva a plotagem em um arquivo? Se você deseja salvar o gráfico de dispersão como um arquivo PDF, a rota padrão é algo como

pdf("figure1.pdf")
print(g)
dev.off()

o pdf() A função faz parte do grDevices pacote que vem com a base R. Quando você chama pdf(), R inicia um driver de dispositivo gráfico para produzir arquivos PDF. A função dev.off() depois fecha o driver do arquivo.

A página de documentação no pdf() função é muito detalhada – consulte ?pdf. Isso destaca a tensão entre a documentação para o desenvolvedor e a documentação para o usuário. O primeiro se preocupa com detalhes, como o fato de círculos maiores usarem uma curva de Bezier. Mas os usuários só querem salvar um gráfico. Eu suspeito que a grande maioria das pessoas que usam o pdf() A função realmente não se importa com os detalhes. Eles só querem um arquivo PDF que contenha sua trama!

Existem outras funções para criar gráficos em PDF. Você poderia usar Cairo::CairoPDF() ou grDevices::cairo_pdf(). Como você pode perceber, essas duas funções usam gráficos cairo. O Cairo é uma biblioteca de gráficos 2D com suporte para vários dispositivos de saída. Essas funções R usam a API do Cairo. O que não está claro na documentação é como as funções diferem (mas veremos as diferenças mais tarde).

Você pode determinar se possui os recursos do Cairo via

capabilities()["cairo"]
#> cairo 
#>  TRUE

A maioria dos sistemas padrão tem suporte ao Cairo. Parte do que encontrei ao escrever este post é que o suporte gráfico em R mudou ao longo dos anos. Portanto, é muito fácil encontrar postagens de blog que contenham informações desatualizadas, especialmente em torno do Cairo.

Leia Também  Aceite o fracasso sem se sentir como um

Uma situação semelhante se aplica aos gráficos PNG. Você pode usar o dispositivo gráfico padrão

png("figure1.png")
print(g)
dev.off()

ou você pode especificar o tipo via png(..., type = "cairo") ou png(..., type = "cairo-png"). Há também um pacote relativamente novo, esfarrapado que pode salvar gráficos como PNGs.

Intuitivamente, essas funções devem produzir saídas diferentes – caso contrário, por que tê-las. Mas qual é a diferença? É o tamanho do arquivo? Velocidade de criação de gráficos? Ou alguma outra coisa.

Plataforma cruzada

Uma das principais características de R é que ela é multiplataforma. Você escreve código R e funciona magicamente no Linux, Windows e Mac. De fato, o código acima “é executado” nos três sistemas operacionais. Mas ele produz o mesmo gráfico em cada plataforma? Spoiler! Nenhuma das funções acima produz uma saída idêntica nos SOs. Então, para “mesmo”, vou ter uma visão relaxada e só quero figuras que tenham a mesma aparência.

Cannoical Graphic

Para criar um gráfico de teste, primeiro criamos alguns dados

library("ggplot2")
set.seed(1)
df = data.frame(x = rnorm(1000), y = rnorm(1000))

Em seguida, crie um gráfico com alguns aspectos desafiadores

ggplot(df, aes(x = x, y = y)) +
  # Anti-aliasing check
  geom_abline(intercept = 3, slope = 1, size = 3) +
  # Font check & newline
  geom_label(x = 2.5, y = -1,
             label = "This is italic textn in Arial Narrow",
             family = "Arial Narrow",
             fontface = "italic", size = 6, label.size = 0) +
  # Font check
  theme_bw(base_family = "Times") +
  # Font check
  theme(axis.title = element_text(face = "italic"),
        plot.title = element_text( face = "bold"),
        plot.subtitle = element_text(face = "italic"),
        plot.caption = element_text(face = "plain")) + 
  # Transparency
  geom_point(alpha = 0.4)

Muitos dos aspectos desse gráfico de teste foram extraídos de outras postagens do blog. Forneci links no final desta postagem

O desafio

O gráfico acima foi criado nos três sistemas operacionais, usando os drivers gráficos listados acima. O script completo pode ser baixado nesta essência do GitHub. Nesta postagem, não me importo com o tamanho do arquivo ou a velocidade do dispositivo gráfico. Como a maioria dos casos de uso de gráficos R realmente não depende de alguns KB ou de um segundo extra para gerar o gráfico, isso parece um comprometimento razoável para este teste. Todos os testes foram realizados usando R 3.6.3 ou R 3.6.2.

grDevices :: pdf ()

Todas as plotagens falharam devido a fontes. Interessante, a versão em pdf foi 1.4, comparada a 1.5 em outros métodos. Leitura cuidadosa do pdf() A página de ajuda sugere que esse comportamento é esperado devido a fontes não padrão. A partir da documentação, tenho certeza de que poderia incorporar as fontes necessárias no arquivo PDF. No entanto, parece claro que existem diferenças entre os sistemas operacionais; portanto, minha correção no Linux pode não ser de plataforma cruzada. Além disso, se alterarmos a fonte, o problema aparecerá novamente.

Leia Também  Vetorizando como um (semi) profissional | R-bloggers

Cairo :: CairoPDF ()

Em todos os sistemas operacionais, essa chamada de função é executada sem erros. No entanto, existem problemas graves de fonte. o x em cada gráfico é diferente e o texto de geom_label() é diferente. Nos Macs, nem está em itálico.

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br

Quando comparamos esses gráficos com a saída de cairo_pdf() e as diferentes funções png, parece que a saída do CairoPDF() está incorreto em todos os sistemas operacionais.

Além disso, usando o pdfinfo No Linux, cada figura foi criada usando uma versão diferente do Cairo: Windows (v1.10.2), Mac (v1.14.6) e Linux (v1.15.0).

grDevices :: cairo_pdf ()

Todos os PDFs gerados têm a mesma aparência, mas não são idênticos! Eles novamente usam versões diferentes do Cairo (variando da v1.14.6 a v1.16.0) e, portanto, têm tamanhos de arquivo diferentes.

Se compararmos Cairo::CairoPDF() para grDevices::cairo_pdf() no Windows, podemos ver que os gráficos criados são significativamente diferentes.

No geral, se você estiver gerando arquivos PDF, é claro que você deve usar grDevices::cairo_pdf() se você deseja que seu código funcione em diferentes sistemas operacionais.

grDevices :: png ()

A função png produz gráficos no Linux e Mac. No entanto, o posicionamento do texto é um pouco diferente, por exemplo, alguns pixels. No Windows, a fonte parece ser o padrão e não Times ou Arial.

Usando o pnginfo A ferramenta também destaca que os três PNGs diferem em

  • Tipo de cor: Linux: paletizado (256 cores) vs Mac: RGB vs Windows:
    paletizado (156 cores)
  • Canais: 1 vs 4 vs 1

Também no Windows, o gráfico não usa anti-aliasing. Esta é uma técnica para suavizar os pixels em linhas retas. Se ampliarmos a linha no Linux / Mac x Windows, podemos ver o efeito “escada”.

grDevices :: png (…, tipo = “cairo”)

Todos os SOs produzem um gráfico parecido. Mas o posicionamento do texto ainda difere em alguns pixels entre os sistemas operacionais – mas é pouco visível. A linha dos eixos parece mais clara no Mac e pnginfo indica que o tipo de cor e os canais diferem.

grDevices :: png (…, digite = “cairo_png”)

Todos os sistemas operacionais produzem um gráfico com aparência semelhante e o posicionamento do texto (a olho nu) é idêntico. Usando pnginfo indica que o tipo de cor e os canais agora são os mesmos.

Leia Também  desafio # explicarCovid19 | R-bloggers

O pacote ragg

Linux, Mac e Windows produziram um gráfico que parecia semelhante e pnginfo indica que todos os atributos eram idênticos. No entanto, a quebra de linha em geom_label() descobriu um bug no esfarrapado pacote, que foi corrigido alguns dias depois.

Conclusão

No geral, parece que obter gráficos idênticos em diferentes sistemas operacionais é mais difícil do que se poderia imaginar primeiro! Para gráficos em PDF, a pior opção é a grDevices::cairo_pdf(), isso não produz gráficos idênticos, pois existem versões diferentes do Cairo em jogo, mas esse teste indica que os gráficos são muito semelhantes. De maneira frustrante, você normalmente salvaria seu gráfico de barras / linhas / dispersão como PDF devido à resolução superior. Mas também parece que isso não é particularmente adequado para ser multiplataforma.

Para gráficos PNG, é claro que você sempre deve usar o type = "cairo_png" com o png() função. No entanto, vou mudar para o esfarrapado em um futuro próximo, especialmente porque o RStudio o está incorporando em seu IDE. A qualidade e o desempenho são impressionantes, e o objetivo é produzir gráficos idênticos entre plataformas.

Veja nossa publicação mais recente do blog sobre a configuração de dispositivos gráficos em um documento da Rmarkdown, para obter detalhes sobre como usar o cairo no knitr.


Jumping Rivers são parceiros certificados de serviço completo RStudio. Parte de nossa função é oferecer suporte nos produtos RStudio Pro. Se você usa algum produto RStudio Pro, entre em contato conosco ([email protected]) Podemos oferecer livre Apoio, suporte.


Links e agradecimentos

Este post usou pedaços de uma ampla variedade de fontes. Felizmente, não esqueci ninguém.

  • Este post realmente começou com uma conversa eletrônica com Bob Rudis há quatro anos, o que resultou neste teste inicial.
  • Este post me fez pensar nos gráficos do Cairo.
  • Outro post no Cairo, com uma olhada em questões anti-aliasing.
  • Graças ao flaticon para obter boas imagens do sistema operacional.
  • Um grande obrigado a Catherine Hurley por executar os testes do Mac.
  • Acho que não usei este post, mas certamente o li. O post fornece uma excelente descrição para trabalhar com imagens e figuras.

A publicação Saving R Graphics entre OSs apareceu pela primeira vez em Jumping Rivers.



Se você chegou até aqui, por que não inscreva-se para atualizações do site? Escolha seu sabor: e-mail, Twitter, RSS ou facebook …



cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br