【LaTex】7.3 pgfplots散点图


  有时候,函数可能是离散的,比如定义域是整数的函数,那么这种如何绘制函数图形呢?这个时候需要散点图。因为离散函数是一个个孤立的点,所以很容易变成折线图、柱状图等等。这个部分内容在我写的 数据分析博文中讲过了。

2D-坐标点集

  现在我们要画散点图,有两种方式,一种是直接在文件中定义数据,另一种是读取外部数据。先看看文件里定义的方式:

\documentclass[utf8,a4paper]{article}
\usepackage{ctex,tikz,pgfplots}
\begin{document}
	\begin{tikzpicture}
	\begin{axis}[]
		\addplot [only marks] coordinates{
			(1,2) (2,3) (3,4) (4,5) (5,6)
			(6,7) (7,8) (8,9) (9,10) (10,11)
		};
	\end{axis}
	\end{tikzpicture}

\end{document}

  其实这就是一句only marks的事。编译效果如下:
在这里插入图片描述

2D-外部文件

  现在试试外部文件数据的写法。先准备文件吧,一个简单的data文件:

x x*x-x+1
1 1
2 3
3 7
4 13
5 21
6 31
7 43
8 57
9 73

  然后在LaTex中引入这个文件:

\documentclass[utf8,a4paper]{article}
\usepackage{ctex,tikz,pgfplots}
\begin{document}
	\begin{tikzpicture}
		\begin{axis}[]
			\addplot [only marks] table[x=x,y=x*x-x+1] {./2d.data};
		\end{axis}
	\end{tikzpicture}
	
\end{document}

  编译效果:
在这里插入图片描述

3D-坐标点集

  接下来的内容就很水了,因为无非就是2D的内容的重复。这些数据哈哈,都是我用python硬造的,比如下列3D数据集:

\documentclass[utf8,a4paper]{article}
\usepackage{ctex,tikz,pgfplots}
\begin{document}
	\begin{tikzpicture}
		\begin{axis}[]
			\addplot3 [only marks] coordinates{
				(0.0,0.0,2.0)
				(0.20791169081775931,0.021852399266194363,1.9781476007338055)
				(0.40673664307580026,0.0864545423573991,1.9135454576426012)
				(0.587785252292473,0.19098300562505255,1.8090169943749472)
				(0.7431448254773942,0.33086939364114176,1.669130606358858)
				(0.8660254037844386,0.4999999999999999,1.5000000000000002)
				(0.9510565162951536,0.6909830056250525,1.3090169943749475)
				(0.9945218953682734,0.8954715367323466,1.1045284632676535)
				(0.9945218953682734,1.1045284632676535,0.8954715367323466)
				(0.9510565162951536,1.3090169943749475,0.6909830056250525)
				(0.8660254037844388,1.4999999999999998,0.5000000000000002)
				(0.7431448254773942,1.669130606358858,0.33086939364114176)
				(0.5877852522924731,1.8090169943749472,0.1909830056250526)
				(0.40673664307580043,1.9135454576426008,0.0864545423573992)
				(0.2079116908177593,1.9781476007338055,0.021852399266194356)
				(1.2246467991473532e-16,2.0,7.498798913309288e-33)
				(-0.20791169081775948,1.9781476007338055,0.021852399266194398)
				(-0.40673664307580026,1.9135454576426012,0.0864545423573991)
				(-0.587785252292473,1.8090169943749477,0.19098300562505247)
				(-0.7431448254773944,1.669130606358858,0.3308693936411419)
				(-0.8660254037844384,1.5000000000000002,0.49999999999999956)
				(-0.9510565162951534,1.3090169943749475,0.6909830056250523)
				(-0.9945218953682734,1.1045284632676535,0.8954715367323466)
				(-0.9945218953682734,0.8954715367323469,1.104528463267653)
				(-0.9510565162951536,0.6909830056250529,1.3090169943749472)
				(-0.8660254037844386,0.4999999999999999,1.5000000000000002)
				(-0.7431448254773946,0.33086939364114215,1.6691306063588578)
				(-0.5877852522924732,0.1909830056250527,1.8090169943749472)
				(-0.4067366430758002,0.08645454235739909,1.9135454576426012)
				(-0.20791169081775984,0.02185239926619447,1.9781476007338055)
				(-2.4492935982947064e-16,2.999519565323715e-32,2.0)
				(0.20791169081775937,0.021852399266194374,1.9781476007338055)
				(0.40673664307580054,0.08645454235739924,1.9135454576426008)
				(0.5877852522924729,0.1909830056250524,1.8090169943749477)
				(0.7431448254773942,0.33086939364114176,1.669130606358858)
				(0.8660254037844388,0.5000000000000002,1.4999999999999998)
				(0.9510565162951534,0.6909830056250523,1.3090169943749475)
				(0.9945218953682734,0.8954715367323466,1.1045284632676535)
				(0.9945218953682734,1.1045284632676537,0.8954715367323463)
				(0.9510565162951536,1.3090169943749472,0.6909830056250529)
				(0.8660254037844393,1.4999999999999993,0.5000000000000009)
				(0.7431448254773941,1.6691306063588585,0.3308693936411416)
				(0.5877852522924734,1.8090169943749472,0.19098300562505274)
				(0.40673664307580104,1.9135454576426008,0.08645454235739948)
				(0.20791169081775912,1.978147600733806,0.021852399266194315)
				(3.6739403974420594e-16,2.0,6.748919021978358e-32)
				(-0.20791169081775837,1.978147600733806,0.02185239926619416)
				(-0.4067366430758004,1.9135454576426008,0.08645454235739918)
				(-0.5877852522924728,1.8090169943749477,0.19098300562505233)
				(-0.7431448254773936,1.669130606358859,0.33086939364114104)
				(-0.8660254037844388,1.4999999999999998,0.5000000000000002)
				(-0.9510565162951534,1.309016994374948,0.6909830056250521)
				(-0.9945218953682732,1.1045284632676544,0.8954715367323454)
				(-0.9945218953682732,0.8954715367323463,1.1045284632676535)
				(-0.9510565162951539,0.6909830056250531,1.3090169943749472)
				(-0.8660254037844392,0.5000000000000009,1.4999999999999991)
				(-0.7431448254773942,0.3308693936411417,1.6691306063588585)
				(-0.5877852522924736,0.19098300562505288,1.8090169943749472)
				(-0.4067366430758012,0.08645454235739955,1.9135454576426008)
				(-0.2079116908177592,0.02185239926619434,1.9781476007338055)
				(-4.898587196589413e-16,1.199807826129486e-31,2.0)
				
			
		};
		\end{axis}
	\end{tikzpicture}
	
\end{document}

  渲染效果:
在这里插入图片描述
  我python造数据的源码也贴出来吧:

from math import sin, cos
import math

if __name__ == '__main__':
    for t in range(0, 366, 6):
        u = math.radians(t)
        x = 2 * sin(u) * cos(u)
        y = 2 * sin(u) * sin(u)
        z = 2 * cos(u) * cos(u)
        print(f'({x},{y},{z})', end='\n')
        if t % 5 == 0:
            print()

3D-外部文件

  我贴出来一组螺旋线的数据,写入3d.data文件中,如下:

x y z
0.1 0.09983341664682815 0.9950041652780258
0.3 0.29552020666133955 0.955336489125606
0.5 0.479425538604203 0.8775825618903728
0.7 0.644217687237691 0.7648421872844885
0.9 0.7833269096274834 0.6216099682706644
1.1 0.8912073600614354 0.4535961214255773
1.3 0.963558185417193 0.26749882862458735
1.5 0.9974949866040544 0.0707372016677029
1.7 0.9916648104524686 -0.12884449429552464
1.9 0.9463000876874145 -0.32328956686350335
2.1 0.8632093666488737 -0.5048461045998576
2.3 0.7457052121767203 -0.666276021279824
2.5 0.5984721441039564 -0.8011436155469337
2.7 0.4273798802338298 -0.9040721420170612
2.9 0.23924932921398243 -0.9709581651495905
3.1 0.04158066243329049 -0.9991351502732795
3.3 -0.1577456941432482 -0.9874797699088649
3.5 -0.35078322768961984 -0.9364566872907963
3.7 -0.5298361409084934 -0.848100031710408
3.9 -0.6877661591839738 -0.7259323042001402
4.1 -0.8182771110644103 -0.5748239465332692
4.3 -0.9161659367494549 -0.40079917207997545
4.5 -0.977530117665097 -0.2107957994307797
4.7 -0.9999232575641008 -0.01238866346289056
4.9 -0.9824526126243325 0.18651236942257576
5.1 -0.9258146823277325 0.37797774271298024
5.3 -0.8322674422239013 0.5543743361791608
5.5 -0.7055403255703919 0.70866977429126
5.7 -0.5506855425976376 0.8347127848391598
5.9 -0.373876664830236 0.9274784307440359
6.1 -0.18216250427209588 0.9832684384425845
6.3 0.016813900484349713 0.9998586363834151
6.5 0.21511998808781552 0.9765876257280235
6.7 0.4048499206165983 0.9143831482353194
6.9 0.5784397643882001 0.8157251001253568
7.1 0.7289690401258759 0.6845466664428066
7.3 0.8504366206285644 0.5260775173811053
7.5 0.9379999767747389 0.3466353178350258
7.7 0.9881682338770004 0.15337386203786435
7.9 0.998941341839772 -0.04600212563953695
8.1 0.9698898108450863 -0.2435441537357911
8.3 0.9021718337562933 -0.43137684497062084
8.5 0.7984871126234903 -0.6020119026848236
8.7 0.6629692300821833 -0.7486466455973987
8.9 0.5010208564578846 -0.8654352092411123
9.1 0.3190983623493521 -0.9477216021311119
9.3 0.1244544235070617 -0.9922253254526034
9.5 -0.0751511204618093 -0.9971721561963784
9.7 -0.27176062641094245 -0.9623648798313102
9.9 -0.45753589377532133 -0.8891911526253609
10.1 -0.6250706488928821 -0.7805681801691837

  使用LaTex渲染,代码很简单:

\documentclass[utf8,a4paper]{article}
\usepackage{ctex,tikz,pgfplots}
\begin{document}
	\begin{tikzpicture}
		\begin{axis}[]
			\addplot3 [only marks] table[x=x,y=y,z=z] {./3d.data};
		\end{axis}
	\end{tikzpicture}
	
\end{document}

  编译效果:
在这里插入图片描述

标签分类

  pgfplot可以将点集通过加标签进行分类,不同类别应用不同的样式。addplot有两种语法,\addplot [only marks] coordinates和table。而table有个meta属性,用于指定标签字段。为了生效,必须加上point meta=explicit symbolic与
scatter两个属性。此外,scatter/classes属性用于指定每个标签的颜色与文字,说了这么多不如拿个例子试一试:

\documentclass[utf8,a4paper]{article}
\usepackage{ctex,tikz,pgfplots}
\begin{document}
	\begin{tikzpicture}
		\begin{axis}[]
			\addplot [
				only marks,
				point meta=explicit symbolic,
				scatter,
				scatter/classes={
					up={red,mark=x},
					down={green,mark=o}
				}
			] table [meta=direct] {
				x y direct
				1 -0.1585 down
				2 -0.5049 down
				3 -1.5909 down
				4 -2.7568 down
				5 -3.195 up
				6 -2.7289 up
				7 -1.9888 up
				8 -1.8391 down
				9 -2.5879 down
				10 -3.7063 down
				11 -4.3166 up
				12 -4.0007 up
				13 -3.1854 up
				14 -2.7511 down
				15 -3.2227 down
				16 -4.2879 down
				17 -5.0845 up
				18 -4.9936 up
				19 -4.209 up
			};
		\end{axis}
	\end{tikzpicture}
	
\end{document}

  编译后效果如下:
在这里插入图片描述

标签文字

  散点图还有处理标签的方式就是把每个点的标签显示出来。要实现这个效果,必须加上nodes near coords,并且要改用\addplot+指令。具体代码,我举个简单的例子:

\documentclass[utf8,a4paper]{article}
\usepackage{ctex,tikz,pgfplots}
\begin{document}
	\begin{tikzpicture}
		\begin{axis}[]
			\addplot+ [
			only marks,
			point meta=explicit symbolic,
			nodes near coords
			] table [meta=name] {
				x y name
				89 91 小明
				68 76 小红
				94 79 小猪
				71 57 小米
				65 81 小虾
			};
		\end{axis}
		
	\end{tikzpicture}
\end{document}

  编译效果:
在这里插入图片描述
  如果不用\addplot+,而是用\addplot,那就是下面这种效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醒过来摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值