|
& ~- p# p+ Y5 f9 ?' Q8 Z* I
原创:宋宋 Python专栏
7 e# t: y& i' T' [! j9 ?. X1 P 来源:Python数据分析:折线图和散点图的绘制
' M8 t; ?- R$ D# k2 G 折线图" U) n4 R. r1 x
折线图用于分析自变量和因变量之间的趋势关系,最适合用于显示随着时间而变化的连续数据,同时还可以看出数量的差异,增长情况。
. {3 s# p, X& I Matplotlib 中绘制散点图的函数为 plot() ,使用语法如下: matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)1) 简单的折线图
* |4 |/ O( p i+ d# N7 g) o) g 在matplotlib面向对象的绘图库中,pyplot是一个方便的接口。 - T2 @- y2 X' F: i3 W% |
plot()函数:支持创建单条折线的折线图,也支持创建包含多条折线的复式折线图----只要在调用plot()时传入多个分别代表X轴和Y轴数据的list列表即可。 * E+ n5 u* U8 H
import matplotlib.pyplot as plt+ C- w& O& _% T4 D C
( X$ i0 @' ^% s. j y x_data = [2011,2012,2013,2014,2015,2016,2017]1 C2 G$ _* t" K4 D0 }
y_data = [58000,60200,63000,71000,84000,90500,107000]
. Q m ^! x( r. X* W, f3 N
' O4 u4 h0 Q( q X8 J- F p( x1 m plt.plot(x_data,y_data)
! U! J7 u, O) L4 e5 p plt.show()
# [" K1 q7 J2 g7 d; ^ + r/ _ ?" M+ J( m! g2 j
( b3 L' G0 S) \- Z
2)复式折线图: D* C( f) d+ B% c
import matplotlib.pyplot as plt& I+ d" d" r Z/ {. O7 g. t7 H/ E: U6 H
x_data = [2011,2012,2013,2014,2015,2016,2017]
% E( H2 ]1 I8 G y_data = [58000,60200,63000,71000,84000,90500,107000]: F1 v. r: w/ ?" p/ P' D, H
y_data2 = [52000,54200,51500,58300,56800,59500,62700]
* [9 q$ F ~$ y, o
) F8 z0 W! i& B) B6 { plt.plot(x_data,y_data,color=red,linewidth=2.0,linestyle=--)6 Q9 X+ q1 ?$ U9 p) V
plt.plot(x_data,y_data2,color=blue,linewidth=3.0,linestyle=-.)
$ {7 ]! X3 k# @5 w% P8 [ plt.show()
2 T' S" H0 ~! |8 C8 Z `+ s8 s
; Y+ Y8 C: X) \' M% } 5 `: G9 D0 k l# G& `4 {" z
注:说明:参数color=’ red ‘,可以换成color=’ #054E9F’,每两个十六进制数分别代表R、G、B分量,除了使用red、blue、green等还可以参照下图小白参数linestyle可以选择使用下面的样式: - solid line style 表示实线-- dashed line style 表示虚线-. dash-dot line style 表示短线、点相间的虚线: dotted line style 表示点线参数 linewidth 可以指定折线的宽度参数 marker 是指标记点,有如下的: N* H' I2 s4 A* D( P
* R- B! ~/ D) t3 c) d 3) 管理图例 对于复式折线图,应该为每条折线添加图例,可以通过legend()函数来实现。该函数可传入两个list参数,其中第一个list参数(handles参数)用于引用折线图上的每条折线;第二个list参数(labels)代表为每条折线所添加的图例 & A9 o1 `1 O2 K1 `5 g- j" |- @
import pandas as pd
5 O7 o6 u8 G2 f* l- U6 `# e import matplotlib.pyplot as plt
. q" `' r+ Y" a
- \6 D" d; a9 P0 P9 T W #读取数据
z1 q8 j* f) @* l8 R data = pd.read_excel(matplotlib.xlsx)! {" J& C# N/ I) Y( ]
( Q. P. a7 E: f/ ]$ _9 f
plt.figure(figsize=(10,5))#设置画布的尺寸/ n' p0 ^/ l0 f" D" I0 l/ n
plt.title(Examples of line chart,fontsize=20)#标题,并设定字号大小
5 ] Z$ p9 f2 g5 u plt.xlabel(ux-year,fontsize=14)#设置x轴,并设定字号大小
0 t" A& g6 T/ R2 ]" L- T plt.ylabel(uy-income,fontsize=14)#设置y轴,并设定字号大小
4 h, H8 N0 ]9 F. V% V7 o% |' x c" I+ ~$ a
#color:颜色,linewidth:线宽,linestyle:线条类型,label:图例,marker:数据点的类型6 F$ ^) F8 F* w! S# n9 s# V% r
in1, = plt.plot(data[时间],data[收入_Jay],color="deeppink",linewidth=2,linestyle=:, marker=o)
{1 g2 @) E2 g. `8 A in2, = plt.plot(data[时间],data[收入_JJ],color="darkblue",linewidth=1,linestyle=--, marker=+)
* o0 _8 }, y0 ~5 B+ W! I3 V in3, = plt.plot(data[时间],data[收入_Jolin],color="goldenrod",linewidth=1.5,linestyle=-, marker=*)6 U. P* v: J4 Z; Q$ G& U9 [# v7 S: B
l; x3 s9 {. V# Q6 }$ k plt.legend(handles = [in1,in2,in3],labels=[Jay income,JJ income,Jolon income],loc=2)#图例展示位置,数字代表第几象限9 b& F9 d. Y* ~8 r
plt.show()#显示图像, D9 S; d" ?0 Y @
' e! f* |4 a: e
4 v, K0 C A8 n: ?# h% I
4) 管理多个子图
N6 D1 t' s+ O$ P4 a6 j import matplotlib.pyplot as plt
1 j% ^1 D$ _7 A+ p! z import numpy as np
2 k$ }0 k6 a# k/ I3 v import matplotlib.gridspec as gridspec
1 _1 K! x4 j* Y# T( M8 p import matplotlib.font_manager as fm #字体管理器. j! i0 Q% ?- q
+ z X, ~7 h; H# P( o4 b my_font = fm.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")9 B9 Y% K: r% `. I( x( z5 B
( p5 w, b: C& ]4 s0 `4 _ plt.figure()# Q' X& Y8 c2 M1 d% s3 L$ R% c4 t
, }" H2 R7 t/ b
x_data = np.linspace(-np.pi,np.pi,64,endpoint=True)! ?: T- j+ L% I7 m0 u$ R+ _( V; W
gs = gridspec.GridSpec(2,3) #将绘图区分成两行三列
2 I$ W0 O1 d& {1 ^! H3 N+ n- K# o ax1 = plt.subplot(gs[0,:])#指定ax1占用第一行(0)整行
" z' o7 v N7 O" y" E) P- ~ ax2 = plt.subplot(gs[1,0])#指定ax2占用第二行(1)的第一格(第二个参数为0)
. ~7 L/ {0 E' l& { ax3 = plt.subplot(gs[1,1:3])#指定ax3占用第二行(1)的第二、三格(第二个参数为1:3)
5 j2 l8 u: H1 d4 ?4 F/ o4 ?: ~+ ^( y$ H+ i6 G) S
#绘制正弦曲线
$ {6 w' }- S# a& _# ~7 O( Y9 q ax1.plot(x_data,np.sin(x_data))
& }# C% M$ U1 Y% ? o, | ax1.spines[right].set_color(none)
( b! [# q* w' j! z8 s: D# B; \/ F ax1.spines[top].set_color(none)9 w( t2 U, }; t9 h* m& x
ax1.spines[bottom].set_position((data,0))
6 L8 W9 s% |2 f1 j9 m ] ax1.spines[left].set_position((data,0)) ]8 H8 e2 ~9 u6 V) F& }
ax1.set_title(正弦曲线,fontproperties=my_font)% w6 O8 a/ A" p, J& ^
. A# u, C$ e2 Y
#绘制余弦曲线& H3 b4 d J3 Z1 e. Z: M7 a M; ?
ax2.plot(x_data,np.cos(x_data))
7 D* \( [: \1 z5 g9 Y6 y4 `. k) r ax2.spines[right].set_color(none)
0 U, R( g1 ^1 p2 a ax2.spines[top].set_color(none)
% }4 R6 T' I; F8 l, `" q2 W- {) x ax2.spines[bottom].set_position((data,0))
: J1 Y7 d. H5 y2 t ax2.spines[left].set_position((data,0))
/ g1 F( v# P0 b- M+ [- ^5 d ax2.set_title(余弦曲线,fontproperties=my_font)6 H: l* i4 |7 w1 `# m5 A) f
" b% E; a3 B& N
#绘制正切曲线; j& a5 A* J2 o+ z7 ^3 h) [1 J
ax3.plot(x_data,np.tan(x_data)); M1 M# W% b0 V! c8 j% e( ?' X/ }
ax3.spines[right].set_color(none)
/ x& u. ]6 D. h7 u# _ e0 g/ V ax3.spines[top].set_color(none)7 w1 b1 L( y$ v4 ~3 x* k
ax3.spines[bottom].set_position((data,0))- X) F9 t7 U# m! `2 c) j
ax3.spines[left].set_position((data,0))! B+ u# q4 @4 i. N4 U4 ^, @
ax3.set_title(正切曲线,fontproperties=my_font)8 \6 d0 C E' T+ I5 D; Z; M) K! T0 A8 W
plt.show()
! @( a5 i. x9 Q7 M1 l
+ ^/ ^' P' w7 G6 n 结果:
4 A" {& h% F& ^7 F! P7 d$ q
% L* {# w6 e" K. N: Y e2 r . q3 ~( k; L$ E2 C. t! S
, e$ |5 o, ^2 S; z4 T
; U+ F9 B2 t+ p2 l5 T% J1 {
% m# L2 j. S3 n! l' y, M) F+ d3 E
9 K2 z# L4 d# D0 } {( ]/ Q/ S |