11

他们是否有任何改进由 geom_line() 产生的锯齿线的过程,将多个点连接成 ggplot2 中平滑的可呈现线?

     lai.se <- structure(list(DOS = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), .Label = c("D1", "D2", "D3"), class = "factor"), 
    DAS = c(31L, 84L, 113L, 132L, 160L, 35L, 82L, 108L, 126L, 
    146L, 37L, 83L, 94L, 113L, 134L), N = c(24L, 24L, 24L, 24L, 
    24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L), LAI = c(1.5879167, 
    4.3241667, 3.70375, 2.9704167, 0.1879167, 1.7679167, 3.7670833, 
    3.4104167, 2.7879167, 0.195, 1.3179167, 3.5233333, 3.1604167, 
    2.45875, 0.2758333), sd = c(0.4276323, 0.32478644, 0.34151596, 
    0.3338638, 0.09868611, 0.18551876, 0.38212767, 0.31431747, 
    0.35024189, 0.08836682, 0.16378616, 0.29256982, 0.28257326, 
    0.44131535, 0.09536733), se = c(0.08729008, 0.06629675, 0.06971165, 
    0.06814966, 0.02014422, 0.03786886, 0.07800148, 0.06415978, 
    0.07149283, 0.0180378, 0.03343271, 0.05972057, 0.05768002, 
    0.09008312, 0.01946677), ci = c(0.18057328, 0.13714529, 0.14420954, 
    0.14097832, 0.04167149, 0.0783377, 0.16135836, 0.13272463, 
    0.14789418, 0.03731404, 0.06916083, 0.1235414, 0.11932022, 
    0.18635113, 0.04027009)), .Names = c("DOS", "DAS", "N", "LAI", 
"sd", "se", "ci"), class = "data.frame", row.names = c(NA, -15L
))
    ggplot(lai.se, aes(x=DAS, y=LAI, colour=DOS)) + 
  geom_errorbar(aes(ymin=LAI-se, ymax=LAI+se), colour ="black", size =.5, width=1, position=position_dodge(.9)) +
  geom_line() +
  geom_point()+ theme_bw()

使用这些代码创建的线条是非常像素化的锯齿形线条。他们有什么办法可以画出更平滑"solid"的线条(不是锯齿形的)?

   > sessionInfo()
R version 2.14.2 (2012-02-29)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_India.1252  LC_CTYPE=English_India.1252    LC_MONETARY=English_India.1252 LC_NUMERIC=C                  
[5] LC_TIME=English_India.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ggplot2_0.9.2.1

loaded via a namespace (and not attached):
 [1] colorspace_1.1-1   dichromat_1.2-4    digest_0.5.2       grid_2.14.2        gtable_0.1.1       labeling_0.1      
 [7] MASS_7.3-17        memoise_0.1        munsell_0.4        plyr_1.7.1         proto_0.3-9.2      RColorBrewer_1.0-5
[13] reshape2_1.2.1     scales_0.2.2       stringr_0.6.1      tools_2.14.2    
4

5 回答 5

6

我猜你正在尝试平滑一条线。这是在你所追求的球场吗?

ggplot(lai.se, aes(x=DAS, y=LAI, colour=DOS)) + 
  geom_errorbar(aes(ymin=LAI-se, ymax=LAI+se), colour ="black", size =.5, width=1, position=position_dodge(.9)) +
  geom_smooth() +
  geom_point()+ theme_bw()

在此处输入图像描述

于 2013-01-14T18:08:28.037 回答
5

将您的图形输出到以矢量格式存储的文件,例如 PDF 或 PostScript,然后使用ImageMagick或类似工具将该矢量图像以高分辨率(150、300 甚至 600)渲染为位图(PNG、JPEG 等) dpi):

$ convert myGraphAsVector.pdf -density 300 myGraphAs300DpiBitmap.png

文件会很大(随着最终产品分辨率的提高,文件会变得越来越大),但位图的锯齿状会在像素密度越高时消失。

于 2013-01-14T18:44:12.750 回答
4

在您对我的评论的回答中,您确认要对线条进行抗锯齿处理(而不是更改绘图曲线)。

我认为在 R 中做到这一点的唯一方法是使用 Cairo,这里有一个关于如何用圆圈做到这一点的教程,我希望你能适应它来用线条做到这一点:

http://www.r-bloggers.com/weekend-art-in-r-part-3/

于 2013-01-14T19:17:09.190 回答
3

正如其他人所提到的,PDF 或 SVG 等基于矢量的图像格式可能是最好的选择。如果您想使用位图,例如 PNG,则可以res使用png().

png("myplot.png", width = 1800, height = 1800, res = 600)

这将以 600 dpi 生成 3 英寸 x 3 英寸的图像(实际尺寸)。根据我的经验,对于相对简单的图表,文件大小仍然是合理的。

有关如何改进图像的更多想法,请参阅此博客文章:

http://blog.revolutionanalytics.com/2009/01/10-tips-for-making-your-r-graphics-look-their-best.html

于 2016-02-09T13:04:21.373 回答
1

老问题,但我很惊讶没有人使用这种方法进行更新:将 ggplot 代码包装在 plotly::ggplotly() 中,如下所示:

plotly::ggplotly(
  ggplot(lai.se, aes(x=DAS, y=LAI, colour=DOS)) + 
  geom_errorbar(aes(ymin=LAI-se, ymax=LAI+se), colour ="black", size =.5, 
                width=1, position=position_dodge(.9)) +
  geom_line() +
  geom_point()+ 
  theme_bw()
)

然后导出为png:

smove-b

为了满足 SO 的图像文件大小规范,这看起来仍然有点锯齿,但原始 png 像黄油一样光滑。

于 2021-08-09T18:01:28.350 回答