• 本站已迁至新址:https://www.91science.com
  • 包含大量新资源、新内容。
  • 22年以前的用户,可以用本站账号直接登录。
  • 新用户需重新注册登录,谢谢各位老师同学。
设为首页 |收藏本站
官方QQ群:
531617987
在线客服:
客服一
客服二
扫码关注公众号
官网地址: scidrawing.com
|切换到宽版
 找回密码

三角板论坛

2020你好呀~
2020你好呀~
查看: 5089|回复: 4
收起左侧

[教程] PGFPlots绘图基础

[复制链接]
  • TA的每日心情
    愤怒
    2022-12-18 02:16
  • 签到天数: 85 天

    连续签到: 1 天

    [LV.6]常住居民II

    117

    帖子

    1336

    学分

    24 小时

    在线时间

    硕士生导师

    Rank: 6Rank: 6

    积分
    1645
    注册时间
    2017-4-21
    最后登录
    2022-12-18
    发表于 2017-4-26 08:04:26 | 显示全部楼层 |阅读模式
    本帖最后由 清华大学 于 2017-4-26 08:17 编辑

    PGFPlots就是一个功能强大的绘图宏集,比较擅长绘制由数据生成的图,比如曲线图 (line plot)、散点图 (scatter plot)、柱状图 (bar plot)等,本身其基于TiKZ开发的,语法方面与TiKZ非常一致,在这篇文章中,我们介绍一些 PGFPlots 的基本绘图功能。

    1 绘制统计图

    统计图常被用于数据分析。下面给出一些用 PGFPlots 绘制统计图的示例。

    1.1 线图

    线图有折线图和光滑折线图两种,我们用一个例子来演示两种线图的画法。

    例1 给出一组数据 {(0,4),(1,1),(2,2),(3,5),(4,6),(5,1)},绘制经过这些点的两种线图。绘制折线图的代码和结果如下:

    1. \documentclass[a4paper]{article}    % 文件类型是A4纸的文章
    2. \usepackage{pgfplots}               % 使用pgfplots绘图工具包
    3. \pgfplotsset{width=7cm,compat=1.13} % 图片绘制的宽度是7cm,使用的pgfplots版本为1.13
    4. \begin{document}                    % 文档开始
    5. \begin{tikzpicture}                 % 绘图开始
    6. \begin{axis}                        % 添加坐标
    7. \addplot+[sharp plot]               % 调用绘图函数,并设置绘图的类型是折线图
    8. coordinates                         % 声明是在迪卡尔坐标系中的数据
    9. {                                   % 输入数据
    10. (0,4) (1,1) (2,2)
    11. (3,5) (4,6) (5,1)
    12. };
    13. \end{axis}                         % 结束坐标
    14. \end{tikzpicture}                  % 绘图结束
    15. \end{document}                     % 文档结束
    复制代码


    下面是绘制光滑折线图的代码和结果:

    1. \documentclass[a4paper]{article}
    2. \usepackage{pgfplots}
    3. \pgfplotsset{width=7cm,compat=1.13}
    4. \begin{document}
    5. \begin{tikzpicture}
    6. \begin{axis}
    7. \addplot+[smooth]                    % 设置绘图的类型是光滑线图
    8. coordinates
    9. {
    10. (0,4) (1,1) (2,2)
    11. (3,5) (4,6) (5,1)
    12. };
    13. \end{axis}
    14. \end{tikzpicture}
    15. \end{document}
    复制代码


    1.2 条形图

    条形图常用于展示各项目间的比较结果。

    例2 给出一组数据 {(0,4),(1,1),(2,2),(3,5),(4,6),(5,1)},绘制一般条形图。代码和结果如下:

    1. \documentclass[a4paper]{article}
    2. \usepackage{pgfplots}
    3. \pgfplotsset{width=7cm,compat=1.13}
    4. \begin{document}
    5. \begin{tikzpicture}
    6. \begin{axis}
    7. \addplot+[ybar]                      % 绘制关于y坐标的条形图
    8. coordinates
    9. {
    10. (0,4) (1,1) (2,2)
    11. (3,5) (4,6) (5,1)
    12. };
    13. \end{axis}
    14. \end{tikzpicture}
    15. \end{document}
    复制代码


    下面的例子演示如何对条形图进行填充来加强数据间的对比。

    例3 根据数据 {(0,4),(1,1),(2,2),(3,5),(4,6),(5,1)} 绘制蓝色边界、红色填充的条形图;同时,根据数据{(0,3),(1,4),(2,2),(3,9),(4,6),(5,2)} 绘制黑色边界、蓝色填充的条形图。代码和结果如下:

    1. \documentclass[a4paper]{article}
    2. \usepackage{pgfplots}
    3. \pgfplotsset{width=7cm,compat=1.13}
    4. \begin{document}
    5. \begin{tikzpicture}
    6. \begin{axis}[ybar,enlargelimits=0.15]  % 绘制关于y坐标的条形图,条形之间的最大间隔是0.15cm
    7. \addplot[draw=blue,fill=red]           % 蓝色边界、红色填充
    8. coordinates
    9. {
    10. (0,4) (1,1) (2,2)
    11. (3,5) (4,6) (5,1)
    12. };
    13. \addplot[draw=black,fill=blue]         % 黑色边界、蓝色填充
    14. coordinates
    15. {
    16. (0,3) (1,4) (2,2)
    17. (3,9) (4,6) (5,2)
    18. };
    19. \end{axis}
    20. \end{tikzpicture}
    21. \end{document}
    复制代码


    1.3 直方图

    直方图又称为质量分布图,是最常用统计图之一。直方图的绘制方式与前面两种统计图略有不同,它依赖于 PGFPlots (?) 自身的计算功能。

    例4 绘制数据 {1,2,1,5,4,10,7,10,9,8,9,9} 的直方图的代码和结果如下:

    1. \documentclass[a4paper]{article}
    2. \usepackage{pgfplots}
    3. \pgfplotsset{width=7cm,compat=1.13}
    4. \begin{document}
    5. \begin{tikzpicture}
    6. \begin{axis}[ybar interval]   % 绘制y条形图,并且分隔出区间
    7. \addplot[hist={bins=3}]       % 绘制图像设置为直方图,组距为3
    8. table[row sep=\\,y index=0]   % 设置表的行以"\"分隔,y的从0开始
    9. {
    10. data\\                       % 输入数据
    11. 1\\ 2\\ 1\\ 5\\ 4\\ 10\\
    12. 7\\ 10\\ 9\\ 8\\ 9\\ 9\\
    13. };
    14. \end{axis}
    15. \end{tikzpicture}
    16. \end{document}
    复制代码


    2 线性回归

    在 PGFPlots 中只能拟合一次函数,不能拟合更高次数的函数。下面给出一个示例。

    例5 绘制数据 {(1,1),(2,4),(3,9),(4,16),(5,25),(6,36)} 的线性回归绘图,代码和结果如下:


    1. \documentclass[a4paper]{article}
    2. \usepackage{pgfplots}
    3. \usepackage{pgfplotstable}
    4. \pgfplotsset{width=7cm,compat=1.13}
    5. \begin{document}
    6. \begin{tikzpicture}
    7. \begin{axis}[legend pos=outer north east] % 将图例放在图外,位于图的东北角
    8. \addplot
    9. table                               % 绘制原始数据的折线图
    10. {                                           % X,Y的原始数据
    11. X Y
    12. 1 1
    13. 2 4
    14. 3 9
    15. 4 16
    16. 5 25
    17. 6 36
    18. };
    19. \addplot
    20. table[y={create col/linear regression={y=Y}}] % 对输入的数据作线性回归
    21. {                                   
    22. X Y
    23. 1 1
    24. 2 4
    25. 3 9
    26. 4 16
    27. 5 25
    28. 6 36
    29. };
    30. \addlegendentry{$y(x)$}          % 给第一个图像添加图例,即原始函数y(x)
    31. \addlegendentry{                 % 给第二个图像添加图例,即线性回归结果a*x+b
    32. $\pgfmathprintnumber{\pgfplotstableregressiona} \cdot x
    33. \pgfmathprintnumber[print sign]{\pgfplotstableregressionb}$}
    34. \end{axis}
    35. \end{tikzpicture}
    36. \end{document}
    复制代码


                                   
    登录/注册后可看大图

    3 绘制函数图像

    PGFPlots 最重要的功能是绘制函数图像,用它绘制二维和三维函数图像非常的简单。接下来,我们将分别展示一些基本函数图像的绘制。

    3.1 二维显式函数图像

    例6 绘制三角函数 f(x)=sinx 和 g(x)=cosx 在定义域 [0,2π] 上的图像。

    1. \documentclass[a4paper]{article}
    2. \usepackage{pgfplots}
    3. \pgfplotsset{width=7cm,compat=1.13}
    4. \begin{document}
    5. \begin{tikzpicture}
    6. \begin{axis}
    7. \addplot+[domain=0:2*pi]          % 设置函数的定义域
    8. {sin(deg(x))};                   % 输入显式函数
    9. \addplot+[domain=0:2*pi]          % 设置函数的定义域
    10. {cos(deg(x))};                   % 输入显式函数
    11. \end{axis}
    12. \end{tikzpicture}
    13. \end{document}
    复制代码


                                   
    登录/注册后可看大图

    3.2 三维显式函数图像

    例7 绘制函数 f(x,y)=x2+y2 的三维函数图像。

    1. \documentclass[a4paper]{article}
    2. \usepackage{pgfplots}
    3. \usepgfplotslibrary{colorbrewer}
    4. \pgfplotsset{width=7cm,compat=1.13}
    5. \begin{document}
    6. \begin{tikzpicture}
    7. \begin{axis}[colorbar]         % 绘制坐标,并设置一个彩色指示条
    8. \addplot3[surf]                % 绘制三维图
    9. {x^2+y^2};                    % 输入二元显式函数
    10. \end{axis}
    11. \end{tikzpicture}
    12. \end{document}
    复制代码


                                   
    登录/注册后可看大图

    我们也可以绘制一些漂亮而“复杂”的三维图像,如下图的“帽子图”。


                                   
    登录/注册后可看大图

    1. \documentclass[a4paper]{article}
    2. \usepackage{pgfplots}
    3. \usepgfplotslibrary{colorbrewer}
    4. \pgfplotsset{width=7cm,compat=1.13}
    5. \begin{document}
    6. \begin{tikzpicture}
    7. \begin{axis}[
    8.     title=Example using the mesh parameter, %图像的标题
    9.     hide axis,                              %隐藏坐标
    10.     colormap/cool,                          %颜色风格
    11. ]
    12. \addplot3[
    13.     mesh,                                   %绘制的三维图像是网格
    14.     samples=50,                             %定义域分割数量
    15.     domain=-8:8,                            %定义域
    16. ]
    17. {sin(deg(sqrt(x^2+y^2)))/sqrt(x^2+y^2)};    %二元显式函数
    18. \addlegendentry{$\frac{sin(r)}{r}$}         %添加图例
    19. \end{axis}
    20. \end{tikzpicture}
    21. \end{document}
    复制代码

    3.3 隐式函数图像

    隐式函数图像的绘制非常复杂。(在 Matlab 中,我们可以利用 isosurface 函数直接绘制隐式函数图像。)一般情况下,我们需要先把隐式函数转化成显式函数或者参数方程的形式。接下来,我们给出一个具体的在 PGFPlots 中绘制隐式函数的示例。

    例8 绘制隐函数 x2+y2=4 的函数图像。我们将该隐函数转化为参数方程:x=2cosx,y=2sinx,定义域为 [0,2π]。

    1. \documentclass[a4paper]{article}
    2. \usepackage{pgfplots}
    3. \pgfplotsset{width=7cm,compat=1.13}
    4. \newcommand*{\A}{2}                    %定义新命令\A为2
    5. \newcommand*{\num}{3}                  %定义新命令\num为3                                
    6. \pgfmathdeclarefunction{SolutionX}{1}{ % X的参数方程
    7.     \pgfmathparse{\A*(cos(deg(\t)))}
    8. }
    9. \pgfmathdeclarefunction{SolutionY}{1}{ % Y的参数方程
    10.     \pgfmathparse{\A*(sin(deg(\t)))}
    11. }
    12. \tikzset{elegant/.style={smooth, red, thick, samples=101}} % 定义风格
    13. \begin{document}
    14. \begin{tikzpicture}     
    15. \begin{axis}[axis lines=middle,        % 设置坐标风格
    16.              xmin=-\num, xmax=\num,     % 坐标的范围
    17.              ymin=-\num, ymax=\num,
    18.              xlabel=$x$, ylabel=$f(x)$] % 横纵坐标的标签
    19. \addplot[elegant,variable=\t, domain=-2*pi:0] % 设置图像风格、变量、定义域
    20. ({SolutionX(\t)},{SolutionY(\t)});      % 绘制隐函数的参数方程
    21. \end{axis}
    22. \end{tikzpicture}
    23. \end{document}
    复制代码


                                   
    登录/注册后可看大图

    4 补充说明4.1 条形图与直方图的区别

    直方图相邻柱体之间没有间隔,而条形图则有。在条形图中,横轴上的数据是孤立的,是一个具体的数据;而在直方图中,横轴上的数据是连续的,是一个范围。条形图是用条形的高度表示频数的大小;而直方图是用长方形的面积表示频数。

    4.2 为什么 PGFPlots 中只能绘制一次线性回归的图像

    我猜测这是由计算的复杂度所致。我们可以使用公式我完成一次线性拟合;而二次(及以上)的回归模型是采用最小二乘法来进行拟合的,计算其系数需要求解一个系数矩阵为范德蒙德(Vandermonde)矩阵的线性方程组,计算非常复杂。

    4.3 为什么 PGFPlots 中不能直接绘制隐式函数的图像

    因为直接绘制隐式函数的图像涉及到求解方程(组),而且往往是求解非线性方程(组),需要的计算量将非常的庞大。比如说,含有两个未知变量的隐函数 f(x,y)=0,为了确定 x0 所对应的点 (x0,y0),我们需要求解方程f(x0,y0)=0,这通常非常复杂。因此,我们一般都是通过隐式函数的参数方程来进行绘图。而有些隐函数求解参数方程非常难,甚至没有参数方程。总之,隐函数图像的绘制一般比较复杂,这也限制了绘制隐函数图像的工具包的开发。

    4.4 一些未解决的疑问
    • 线性回归的函数的实现细节。
    • 哪种绘制隐式函数图像的方法比较好用,是转成参数的形式,还是转化成显式函数的形式?
            

    当他人从你分享的链接访问本页面时,每一个访问者的点击,你将获得[2学分]的奖励,一个IP计算一次.

    温馨提示:
    1、在论坛里发表的资源类教程及软件属于作者个人行为,如有侵权,请及时联系我们处理。
    2、转载本论坛的原创内容,请注明“转载自:三角板论坛科研论文作图网”
    3、论坛内的帖子内容,仅代表作者个人观点,如出现涉及敏感话题内容,我站愿积极配合删除帖子,并对作者进行法律追究。
    4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
    5、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。

    该用户从未签到

    11

    帖子

    0

    学分

    2 小时

    在线时间

    贪玩小学生

    Rank: 1

    积分
    11
    注册时间
    2017-3-17
    最后登录
    2017-4-26
    发表于 2017-4-26 08:04:29 | 显示全部楼层
    小手一抖,沙发到手!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    17

    帖子

    0

    学分

    5 小时

    在线时间

    贪玩小学生

    Rank: 1

    积分
    17
    注册时间
    2017-3-21
    最后登录
    2017-4-26
    发表于 2017-4-26 08:04:57 | 显示全部楼层
    学习了,不错,比较有意义
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    加油自己
    2022-7-13 22:26
  • 签到天数: 308 天

    连续签到: 1 天

    [LV.8]以坛为家I

    335

    帖子

    4230

    学分

    139 小时

    在线时间

    院士

    Rank: 10Rank: 10Rank: 10

    积分
    5101

    勤奋学子

    注册时间
    2017-9-26
    最后登录
    2022-7-13
    发表于 2017-10-7 14:44:44 | 显示全部楼层
    好东西,学习一下!
    克里斯蒂娜 能把我的初吻还来嘛?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    加油自己
    2021-3-3 18:08
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    13

    帖子

    130

    学分

    3 小时

    在线时间

    勤奋中学生

    Rank: 2

    积分
    155
    注册时间
    2018-3-8
    最后登录
    2023-1-30
    发表于 2023-1-16 14:09:53 | 显示全部楼层

    @pump_upp - best crypto pumps on telegram !

    https://t.me/pump_upp - best crypto pumps on telegram
    Make 1000% and more within 1 day, join channel @pump_upp !
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    点我微信扫码秒登录↓↓

    QQ| Archiver|手机版|小黑屋| 三角板论坛 |网站地图

    Copyright © 2001-2013 Adminbuy.Cn.   All Rights Reserved.

    ( 京ICP备14051802号-2 )

    快速回复 返回顶部 返回列表