|
; [( }# \: d* _+ Z 原创:宋宋 Python专栏 1 u+ w. ^' i- J
来源:Python数据分析:折线图和散点图的绘制 4 @6 l6 o( N- v- T
折线图% q9 y3 G5 N. o$ @9 h
折线图用于分析自变量和因变量之间的趋势关系,最适合用于显示随着时间而变化的连续数据,同时还可以看出数量的差异,增长情况。
9 o, |/ @- B" {. e* N6 s0 e Matplotlib 中绘制散点图的函数为 plot() ,使用语法如下: matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)1) 简单的折线图
; v% V5 M% }& s 在matplotlib面向对象的绘图库中,pyplot是一个方便的接口。
+ ?# `+ o% n/ L9 j: J( q* r plot()函数:支持创建单条折线的折线图,也支持创建包含多条折线的复式折线图----只要在调用plot()时传入多个分别代表X轴和Y轴数据的list列表即可。 " D; s1 N1 O+ F' \
import matplotlib.pyplot as plt
) Y2 d0 X. \5 |3 u$ |4 Z: i/ ?. x! U) h
x_data = [2011,2012,2013,2014,2015,2016,2017], K4 L$ r6 c+ @2 B; O% s
y_data = [58000,60200,63000,71000,84000,90500,107000]/ g- T/ I' b, a/ Y2 s
8 L0 B; X- m' i/ _
plt.plot(x_data,y_data)% u/ b0 V1 l0 b* O/ }, J. P
plt.show()6 _, z' d4 P6 q8 H- f; u3 L7 d* E
& u" v) D0 E2 ~; E5 w& j
+ q, ~4 J& i6 Q0 Q0 u' E 2)复式折线图: 6 D$ E0 t% X% g+ B/ ] |% P
import matplotlib.pyplot as plt/ e' P4 N5 A0 d3 \; D4 U8 t
x_data = [2011,2012,2013,2014,2015,2016,2017]
7 Q' G! t8 F1 x/ @1 Q y_data = [58000,60200,63000,71000,84000,90500,107000]! q; ?$ c- Y4 s" r' R6 m
y_data2 = [52000,54200,51500,58300,56800,59500,62700]
a* I1 X4 I9 s) u' C' \2 ?; G3 K
+ {, R& [4 X& {# V1 j; v' V plt.plot(x_data,y_data,color=red,linewidth=2.0,linestyle=--)% Y. ^& |# B* a
plt.plot(x_data,y_data2,color=blue,linewidth=3.0,linestyle=-.), }- e+ a( G; f( `. K) I
plt.show()9 y+ Y1 L* h8 e) r9 @
9 \ q* I, L8 Y: a6 A9 m0 g
- z6 o# z$ C3 X/ Y6 B7 A 注:说明:参数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 是指标记点,有如下的:
; l9 K- f- b1 a3 N2 D3 ^" v- k
, }# U* h! \: v, M* q 3) 管理图例 对于复式折线图,应该为每条折线添加图例,可以通过legend()函数来实现。该函数可传入两个list参数,其中第一个list参数(handles参数)用于引用折线图上的每条折线;第二个list参数(labels)代表为每条折线所添加的图例 , |9 l9 e( i# Z$ Q% {
import pandas as pd
) e( e! L$ m) v5 X import matplotlib.pyplot as plt7 Q) n; A# m( D- l) b# u
/ v$ Q3 B! L" d* H5 C( l #读取数据
' N$ f5 W" C5 ~3 T5 w9 Z data = pd.read_excel(matplotlib.xlsx)
% _8 i/ v5 Y/ W( s) d( Z
( y4 m7 R4 J9 D+ w" @ plt.figure(figsize=(10,5))#设置画布的尺寸- y8 j0 P2 `: T$ k) f. u
plt.title(Examples of line chart,fontsize=20)#标题,并设定字号大小
8 C3 B4 ]/ P% {3 s4 P6 ` plt.xlabel(ux-year,fontsize=14)#设置x轴,并设定字号大小
" H; t1 N5 y/ S3 W2 R8 x plt.ylabel(uy-income,fontsize=14)#设置y轴,并设定字号大小6 Q& k& V @/ Q& \5 M
# L* n3 Q9 W; l, b+ d( }
#color:颜色,linewidth:线宽,linestyle:线条类型,label:图例,marker:数据点的类型
( h/ d9 q( V- N' m! I+ k in1, = plt.plot(data[时间],data[收入_Jay],color="deeppink",linewidth=2,linestyle=:, marker=o)$ I+ u8 F8 O7 J3 L& k2 R+ O4 |1 m
in2, = plt.plot(data[时间],data[收入_JJ],color="darkblue",linewidth=1,linestyle=--, marker=+)
( p+ y c1 W6 M9 }( z& T) W in3, = plt.plot(data[时间],data[收入_Jolin],color="goldenrod",linewidth=1.5,linestyle=-, marker=*)8 m1 V0 x) C# h O
- u2 i |- K+ x( A9 d
plt.legend(handles = [in1,in2,in3],labels=[Jay income,JJ income,Jolon income],loc=2)#图例展示位置,数字代表第几象限2 F- _4 i1 a% ], I
plt.show()#显示图像
+ H0 J. g: R/ `- W ; f9 O9 @* P7 K
7 t4 h4 h Z0 e1 l
4) 管理多个子图 ) [1 \- Z! w; @( I4 ^
import matplotlib.pyplot as plt
5 F' `$ ^% w% `: U1 ] ]8 U import numpy as np
) H( i1 z- }: j! D/ C' t. j# P import matplotlib.gridspec as gridspec/ N' B+ _; z6 d; g. J( r) u
import matplotlib.font_manager as fm #字体管理器' M5 ~; x) e& [0 t0 J
# k8 k$ U% B! } my_font = fm.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")& A$ E* o+ x3 J, P1 K+ i
- H. O0 w# C6 X5 @& C8 c* u( w plt.figure(), M9 @& h; \1 S9 f: [) i2 `2 L* `
% M- F& @5 t$ E' Z x_data = np.linspace(-np.pi,np.pi,64,endpoint=True). I: l! p0 i* z" S( \' s
gs = gridspec.GridSpec(2,3) #将绘图区分成两行三列
9 u' C a9 {) e5 L: G ax1 = plt.subplot(gs[0,:])#指定ax1占用第一行(0)整行) `7 P7 K# c2 P5 ^5 W, a
ax2 = plt.subplot(gs[1,0])#指定ax2占用第二行(1)的第一格(第二个参数为0). X8 e$ w* v1 [+ C4 x: b
ax3 = plt.subplot(gs[1,1:3])#指定ax3占用第二行(1)的第二、三格(第二个参数为1:3)
& v3 l0 @: A [4 g5 H% A2 @% p# D5 L0 R5 m2 D, W( l
#绘制正弦曲线/ Z1 O8 s& U5 H) \: z4 m
ax1.plot(x_data,np.sin(x_data))2 Z) y1 d W9 ~: ^0 A
ax1.spines[right].set_color(none)
' X p3 d) j/ b2 ?9 v3 }( @) o ax1.spines[top].set_color(none)
\; V1 H) F! H* S, v$ p ax1.spines[bottom].set_position((data,0))
; r9 @; }6 e* Z+ ^7 Q% q6 G: { ax1.spines[left].set_position((data,0))% h$ ?, l3 B# D
ax1.set_title(正弦曲线,fontproperties=my_font)" X% S$ g L& b* `
. `0 T E( `5 S$ M3 E1 Q$ o #绘制余弦曲线2 N9 Y {" N# d7 S' b% q
ax2.plot(x_data,np.cos(x_data))6 C$ K! V& P. @8 F0 ~4 M
ax2.spines[right].set_color(none)2 L) v+ a/ I$ z, i( U
ax2.spines[top].set_color(none)
! ]7 A% i. D% A b. d6 y# { ax2.spines[bottom].set_position((data,0))# |' n6 N& y' ~' ^# }) u5 c
ax2.spines[left].set_position((data,0))
( U, a5 e+ T8 J8 x- P ax2.set_title(余弦曲线,fontproperties=my_font)
1 H1 V. D9 F, ~9 \ [" d
3 @8 s* z6 Y0 t6 d0 y: o #绘制正切曲线
2 |2 C$ ^" M6 A4 U$ h ax3.plot(x_data,np.tan(x_data))3 V1 S P, P. o! n* w l% u
ax3.spines[right].set_color(none)$ a1 F$ Y7 f0 Z* Y% h; r7 c, a
ax3.spines[top].set_color(none)
7 Z/ n* d0 }* |- M ax3.spines[bottom].set_position((data,0))( q$ b# c* Q6 E, O2 T" R
ax3.spines[left].set_position((data,0))
@& w! J/ U: I" z ax3.set_title(正切曲线,fontproperties=my_font)
; f7 |3 B: G1 Q! [ plt.show()! X, j" ]+ Q/ Z4 F0 H
$ S7 ?5 W: R/ r' \8 I" J 结果:
4 Y9 Q# ?, M+ ]" ?2 c 0 X F# U% F/ Q6 n! O& M6 n7 M0 R
) E8 r7 f0 |* b) \' k; E0 c9 j" c) a0 G0 P
# X5 e5 w7 b3 ]) ?$ j) r1 r! Q; j
: M5 d: R+ ^. w, r. m7 o
|