• R语言
  • 请问如何用ggplot画出曲线簇?

再来个 Base R 版,去掉所有额外包的依赖,打擂:

df <- transform(
  expand.grid(
    x = seq(0.1, 10, by = 0.1), 
    z = 1:4),
  y = z / x)
plot(df$x[df$z == i], df$y[df$z == i], type = 'l', xlab = 'x', ylab = 'y')
for(i in 2:4) lines(df$x[df$z == i], df$y[df$z == i], col = i)
legend('topright', legend = 1:4, col = 1:4, lty = 1, title = 'z')

以及 lattice 版:

lattice::xyplot(y~x, groups = z, data = df, type = 'l', ylim = c(0, 10), auto.key = list(corner = c(1, 1), points = FALSE, lines = TRUE))

相比之下,ggplot2 确实优雅。

    dapengde 来,老夫聊发个少年狂:论 R 基础图形,当今世上恐怕没几个人是我的对手,毕竟我是写过《古代统计图形》的,哈哈哈。两行代码给你搞定:

    for (z in 4:1) curve(z/x, 0, 10, add = z < 4, col = z)
    legend('topright', legend = 4:1, col = 4:1, lty = 1, title = 'z')

      yihui 看到这里方才惊觉,我被 tidyverse 暗中洗脑了。上面我的 Base R 方案完全没必要先生成 data.frame。下面这样就足够了:

      x = seq(0.1, 10, by = 0.1)
      plot(x, 1/x, type = 'l', xlab = 'x', ylab = 'y')
      for (z in 2:4) lines(x, z/x, col = z) 
      legend('topright', legend = 1:4, col = 1:4, lty = 1, title = 'z')

      curve() 我好像从没用过。

      @Liechi 瞧, expand.grid()根本用不上。

        yihui 看完你的解法,耳边响起了熟悉的旋律:

        问世间 是否此山最高
        或者另有高处比天高
        ...

        dapengde 我已用歌声表达了我的感受。

        我现在也有点极乐净土病了:最开始版本的代码,顺手祭出了神包 玛格丽特,写完后惊觉整个代码段,其实只有一处用了 %>%df %>% ggplot() + ...),赶紧灰溜溜地把 玛格丽特 请回去,改写成 ggplot(df, ...) + ...

          matplot(outer(seq(0.1, 10, by = 0.1), 1:4, function(x, a) a / x),
            xlab = "x", ylab = "z/x", type = "l", col = 1:4, lty = 1
          )
          legend("topright", legend = 4:1, col = 4:1, lty = 1, title = "z")

            Liechi
            df %>% ggplot的一个好处是ggplot里aes的列名自动补齐终于可以正常工作了…发现这一点之后我就再也回不到从前啦

              Cloud2016 我来打个代码高尔夫,把你的代码略微缩一下(代价是不那么易懂了):

              matplot(t(outer(1:4, (1:100)/10, `/`)),
                xlab = "x", ylab = "z/x", type = "l", col = 1:4, lty = 1
              )

              不过还是不如我的 curve() 方案短小,主要是 curve() 自动生成了横纵坐标的标题。

              画数据图的话,ggplot 完胜;画示意图的话,R 基础图形还是有点优势的。前者本来就是建设在数据框基础上的,所以要画示意图还得事先生造出一个干净的数据框,在那之后一切都简单多了;后者则是纸笔模型,自己拿着笔画点画线,所以用来画数据图形则会显得很繁琐。

                涨见识了。我感觉我的极限就是 plot + lines,更高级的消化不了,隔断时间不用就忘干净。

                建议以后对 cosx 所有的提问都给出 Base R 版和 Tidyverse 版 。做做大脑体操。简称 B 版和 T 版。我自告奋勇整理成书。书名我都想好了:BT 擂台赛。

                  dapengde 赞呐!

                  yihui 缩略的好,这次放出的《“古”代统计图形》是我看到最完整的,既然11年就有365页了,为啥当时不出版?现在看的话,部分内容需要更新了

                    tctcab 果然如此。这个差异以前没有意识到,看来是回不去了。

                    如果用 ggplot2, 可以用 stat_function 把生成数据这一步抽象掉。

                    library(ggplot2)
                    out <- ggplot(data.frame(x = c(0, 10)), aes(x))
                    for (i in 1:4) {
                      out = out + stat_function(fun = function(.x ,z) z/.x, 
                                                color = i, 
                                                args = list(z=i),
                                                xlim=c(i/10,10) )
                    }
                    out

                    我以前画图用TikZ 或 Mathematica。 刚用 R 时,觉得画函数图像还得先“生成数据”这一步很奇怪,画出来的图不是“矢量图”。后来才发现 TikZ 不过是把“生成数据”这一步抽象掉了。

                    Update: 之前犯了两个错误 (i) 循环变量应该在 args 里,(ii) x得从 z/10开始,因为要求 y 在0到10取值。很奇怪 stat_function 没有 ylim 这个参数。dapengde 我给你那个 bookdown 项目交了 PR.

                      yihui 我在学校的几年,基本把图书馆关于 R 的书,浏览了个遍,比较全面细致地去教人如何画图的几乎没有,它们看起来都是镜面反射,没有一点新意,唯独对《“古”代统计图形》抱有很大期待,相比于其它书籍,这本书的优势是追根溯源,用词考究,关于 Base R 的特别全面,这对于那些要往期刊上发文章的,是特别好的作图参考材料,特别好的参数查询手册,近些年,关于 Base R 的另外一本好书是 Thomas Rahlf 的 《Data Visualisation with R》相应的网站 <http://www.datavisualisation-r.com/>,别的就没见着了

                      我本想把多年沤在书签和硬盘里的东西整理出来,其实有段时间也确实在整理,见 RGraphics,后来又想到这对于当下的我,可能不是重点,就没继续整理,而且我也没有在统计图形里深入研究过,不太可能写的比谢大还好,目前它变成了个分类器,除了数据处理、 ggplot2 和案例,也没多少兴趣继续,索性搁置了!

                      最近,我买了两本中文技术书,一本是《统计学习方法》第二版,一本是《深度学习》中译本,前者是自己一个人在写,后者是开源在 Github 上,一大群人在翻译。蹭热度没什么不好,但是为了赶时间降低质量就不能理解了,最讨厌写书也走敏捷开发的路子,带坏风气,如果一个人时间精力不够,质量把控不过来,就号召一群人来把控呀,我觉得这两本书在质量上现在形成鲜明的对比。我是那种不喜欢追时髦的人,特别是技术书和教材,我偏向于沉淀下来的经典著作(这一点是我导师带给我的影响,研究生阶段主要在啃十余年以前的专著,所以我看到书里的用词,就特别去思考,实在忍不住就在票圈里吐槽)。

                      最后,总结一下,写书追求完美没什么不好,总比误人子弟好!如果精力不够就开源出来,一群人的眼睛盯着质量总比一个人赶工期好的多!谢大的书是不出版,放个样张也造福大众,绝对是个异数。

                        yihui
                        于是出版社少了一本神作,江湖上多了一个传说。

                        浏览了一遍,内容(对统计图形的介绍)和文笔都是上品,能潜心看下去的读者定会受益匪浅。只是在哥哥作图如日中天的现在,基础 R 图形代码可能对一些人来说略“不合时宜”。

                        3.7 图例首句有个别字。

                          Cloud2016 好,我尽快抽空开源出来,但我的源文档是 LyX 写的。你四个月前的回帖我还放在我的浏览器里没关:https://d.cosx.org/d/420476/26 就等着你们把它转成 bookdown 了,估计有不少技术难点。

                          Liechi 时隔这么久,我自己都不敢看了。文风里有不少稚气和卖弄的成分,而且内容上我怕我看了会无限挑刺。