|
5 Y& c; G( e& H$ @
原创:宋宋 Python专栏
; z' W3 C% X9 G& j5 d 来源:Python数据分析:折线图和散点图的绘制 - Q0 Q( O K- i; @+ W0 Z: B! `3 g
折线图
: Y2 v4 S7 b' H 折线图用于分析自变量和因变量之间的趋势关系,最适合用于显示随着时间而变化的连续数据,同时还可以看出数量的差异,增长情况。
# J H- e4 t' Z1 Y3 L( s) G- T; U Matplotlib 中绘制散点图的函数为 plot() ,使用语法如下: matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)1) 简单的折线图
' D' K7 s- o' f* ~ 在matplotlib面向对象的绘图库中,pyplot是一个方便的接口。 5 t# a% B8 p' v4 w$ @; @4 }1 Q: Z
plot()函数:支持创建单条折线的折线图,也支持创建包含多条折线的复式折线图----只要在调用plot()时传入多个分别代表X轴和Y轴数据的list列表即可。
0 _( p+ ^: T, o7 q2 Q import matplotlib.pyplot as plt" |/ K1 w5 a. T8 O! ~5 d2 H
0 f; s' R7 |/ n( r3 e2 H$ A x_data = [2011,2012,2013,2014,2015,2016,2017]
; P6 R2 T+ f/ r% h2 m) H y_data = [58000,60200,63000,71000,84000,90500,107000]8 p6 x2 b3 l# C; q1 \' N
" f) D* d6 y( v; Q( C plt.plot(x_data,y_data)! s3 y' x6 ], q" H* f P& [; q
plt.show()
& c& D9 O" L0 P) o- o: t/ E/ F
4 n. a2 ]2 z) }$ E1 M/ P3 d
# ^5 _ K% i0 `! d# f 2)复式折线图: + i) ~8 p# _. N0 p p3 Q
import matplotlib.pyplot as plt; Z8 y2 L- k+ i! y) N! G: ?0 n
x_data = [2011,2012,2013,2014,2015,2016,2017]
$ R' k. K. L, [% k# F; x$ Q3 O# x y_data = [58000,60200,63000,71000,84000,90500,107000]
( D. E b' s1 ]8 Y" |5 H- a: J y_data2 = [52000,54200,51500,58300,56800,59500,62700]
1 l) W7 X5 k# f7 a) f8 x1 J" P- q# X1 O
2 B: z# d; e. H$ d% ~. I* t1 M plt.plot(x_data,y_data,color=red,linewidth=2.0,linestyle=--)/ ]& c" Y o& A. {* G. M& W4 H
plt.plot(x_data,y_data2,color=blue,linewidth=3.0,linestyle=-.)6 C$ \1 q! b+ d' t+ ]8 J+ e
plt.show()
, n6 e7 F* s3 F$ J3 g1 l * Z3 j4 N3 e/ G$ O, G: K( V
; N% |7 a- G3 y& y6 F: m
注:说明:参数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 是指标记点,有如下的: ! v+ k- I( J8 ^- B
/ f5 R7 v& E( d2 {: d7 z 3) 管理图例 对于复式折线图,应该为每条折线添加图例,可以通过legend()函数来实现。该函数可传入两个list参数,其中第一个list参数(handles参数)用于引用折线图上的每条折线;第二个list参数(labels)代表为每条折线所添加的图例 2 @' x' A$ s" U% z Z8 }1 S
import pandas as pd$ A9 |; T4 A+ a2 `
import matplotlib.pyplot as plt, y% E: [+ }& |1 F4 T3 a9 W( l
* _/ K- F- M7 S ^& p6 y) _ #读取数据
7 n6 f! [% r. ~' k s* J data = pd.read_excel(matplotlib.xlsx)' Z- \ I4 }9 e9 _7 w
3 _7 Z* V+ j* u ^/ Q T( G1 d3 Y plt.figure(figsize=(10,5))#设置画布的尺寸
" w6 f# o! D, m& Y1 [ plt.title(Examples of line chart,fontsize=20)#标题,并设定字号大小
y9 c% G* }0 O: R) Z plt.xlabel(ux-year,fontsize=14)#设置x轴,并设定字号大小
5 X' v7 T" ^- M+ {+ {$ X- y plt.ylabel(uy-income,fontsize=14)#设置y轴,并设定字号大小
3 L" G) Q% n$ Z5 g9 L
* }7 J$ `. B' v* i9 H8 j2 O8 ] #color:颜色,linewidth:线宽,linestyle:线条类型,label:图例,marker:数据点的类型3 ]' n1 L2 Y4 N/ z( ~
in1, = plt.plot(data[时间],data[收入_Jay],color="deeppink",linewidth=2,linestyle=:, marker=o)
) a$ B. |# N# R6 T in2, = plt.plot(data[时间],data[收入_JJ],color="darkblue",linewidth=1,linestyle=--, marker=+)8 w6 y' h1 ~, s c8 N/ a& K
in3, = plt.plot(data[时间],data[收入_Jolin],color="goldenrod",linewidth=1.5,linestyle=-, marker=*)
: X8 a3 D% R# }, I) v, S) p: c. A. X# C5 [- ^" @ w u
plt.legend(handles = [in1,in2,in3],labels=[Jay income,JJ income,Jolon income],loc=2)#图例展示位置,数字代表第几象限
6 ?$ m9 `! C* J' b, {& ~7 ^ plt.show()#显示图像+ c) f5 i+ u: P7 W5 O8 g" \2 k6 W& X1 ^
# @0 w! Z$ b# t8 b" h* f
- X7 _" G- c. r$ C: D5 V, V
4) 管理多个子图
0 ~8 |: J, [8 F0 R import matplotlib.pyplot as plt/ Y8 E: J# P8 {" }+ `2 d% `% x
import numpy as np! \1 W5 D9 N) S/ Z' }, ?
import matplotlib.gridspec as gridspec
; X! N. n/ G! B& {4 J# Q, H( d import matplotlib.font_manager as fm #字体管理器( G3 N. i" V. a7 o7 g( z2 A& H) u5 ?- [
. _5 i# i' W- g. k my_font = fm.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")/ m' d4 U9 v2 v9 y$ @7 T6 {9 Q5 m
! u/ G; }9 @6 h+ u$ h$ w plt.figure()7 b4 g/ d4 r1 A/ z$ K
\* G, H0 O3 h+ N: a1 w x_data = np.linspace(-np.pi,np.pi,64,endpoint=True)
* B. a$ }4 P8 z; p0 J gs = gridspec.GridSpec(2,3) #将绘图区分成两行三列
4 r% O9 @/ s2 D4 a2 O- ~ ax1 = plt.subplot(gs[0,:])#指定ax1占用第一行(0)整行- L- e6 d+ f" m1 p- R0 ?( y4 o
ax2 = plt.subplot(gs[1,0])#指定ax2占用第二行(1)的第一格(第二个参数为0)& Z7 n: P1 K" s% m) w
ax3 = plt.subplot(gs[1,1:3])#指定ax3占用第二行(1)的第二、三格(第二个参数为1:3), L' o1 F' w, t/ m" a" {0 R: t
# M8 Z& ?( T: N3 s
#绘制正弦曲线
0 r6 [* A2 X; w# L5 z ax1.plot(x_data,np.sin(x_data))
8 Z% k: f5 B- Z: J6 a4 l& ^ ax1.spines[right].set_color(none)# h9 x+ ^3 P5 @, P) q6 m
ax1.spines[top].set_color(none)( c- _1 _ Q7 {7 w
ax1.spines[bottom].set_position((data,0))
7 }* Z9 B' p( ~) M% i* N/ s ax1.spines[left].set_position((data,0))
3 |( h8 Y p* p8 i* A% j ax1.set_title(正弦曲线,fontproperties=my_font)) k- T7 r+ L0 d% a. i
5 J' Y" o6 g/ @2 `) J" s #绘制余弦曲线: F6 F! [5 f" B0 s. h( m
ax2.plot(x_data,np.cos(x_data))$ a5 z, m' d2 w. L& [8 s
ax2.spines[right].set_color(none)
% H) ~3 @* Z" b* @8 V ax2.spines[top].set_color(none)( p$ B) ^. y& N% M7 q! v8 g6 B
ax2.spines[bottom].set_position((data,0))" f% L+ l, O! X/ l
ax2.spines[left].set_position((data,0))
+ L5 d: \9 A" G4 V9 v4 j( W* ^, K ax2.set_title(余弦曲线,fontproperties=my_font)/ V( A) L+ E6 f) v' R: t
4 ^8 C/ P, J5 l" n6 s% a
#绘制正切曲线0 e1 E) Z% ?$ O! d f; B# o5 j* D
ax3.plot(x_data,np.tan(x_data))) X* D0 {, m% Z& p
ax3.spines[right].set_color(none)
* q+ O" I, S$ Q. W' } ax3.spines[top].set_color(none)
& h9 Z; i0 n* Z, e8 }, g ax3.spines[bottom].set_position((data,0))& s. J5 G; u! T q! U! W+ `
ax3.spines[left].set_position((data,0))
0 b( R5 @8 U: z/ q% a6 c& i9 | ax3.set_title(正切曲线,fontproperties=my_font)$ v ~5 i$ Q6 \( Z) w) m' s' T
plt.show(). z! S N" Q. g3 {) q1 T6 T- ?2 m
# t# h6 i4 Q2 k" ^4 P
结果: , i( C% S" f" [5 a
1 }2 p; j% n/ r# Q- @& ^6 w
; B$ f$ T" r+ X8 I* ]
! M8 w' t2 d! d# J: D. M- Z$ ?% a0 h! p" v: c
- ~7 d9 v" N( z) z4 C2 u/ U
2 c0 s b9 g/ x |