, m, y0 n- L2 n/ F& W 原创:宋宋 Python专栏 " z+ K: y$ B6 w! R. A9 C8 i
来源:Python数据分析:折线图和散点图的绘制 - x2 B+ f6 z6 `1 l+ ^7 p
折线图% g% r% d6 k, G6 g; s$ ?8 e1 T) Z
折线图用于分析自变量和因变量之间的趋势关系,最适合用于显示随着时间而变化的连续数据,同时还可以看出数量的差异,增长情况。 5 R. u% C8 I5 q7 N5 H+ B
Matplotlib 中绘制散点图的函数为 plot() ,使用语法如下: matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)1) 简单的折线图 5 q4 ?6 U' W+ }. @ m
在matplotlib面向对象的绘图库中,pyplot是一个方便的接口。 : U) Y3 K1 P% e6 b& X7 `$ G
plot()函数:支持创建单条折线的折线图,也支持创建包含多条折线的复式折线图----只要在调用plot()时传入多个分别代表X轴和Y轴数据的list列表即可。
! x, R4 |( k/ K( v' W1 ?) Q import matplotlib.pyplot as plt
+ {; `6 T7 W) C. i
) n; ]: f! C+ O2 J$ n6 ^0 D x_data = [2011,2012,2013,2014,2015,2016,2017]
; A, E$ ~6 J6 ], ~0 p) ? y_data = [58000,60200,63000,71000,84000,90500,107000]/ H8 p5 e" M: e0 p8 x z# P
7 p, N3 b) ~, L9 r
plt.plot(x_data,y_data)
4 x1 x) \3 {- w8 W plt.show()9 V. Y. B. f3 v3 W: M1 T! K5 e3 s
- |5 W! P2 u Y, j* N" |9 P* H ! i4 x9 ~5 ?7 F9 J: L. ~6 U* K
2)复式折线图:
G6 N) V* \, Q2 {$ E import matplotlib.pyplot as plt2 w) e: p) ~& H. c
x_data = [2011,2012,2013,2014,2015,2016,2017]
# K' f: v: q" z6 e y_data = [58000,60200,63000,71000,84000,90500,107000]
8 Q' J% }3 ]5 Q# n+ V y_data2 = [52000,54200,51500,58300,56800,59500,62700]
' F8 f( j7 t1 v g6 {" S8 k( U+ `9 K8 R& H. k: ~* \9 E
plt.plot(x_data,y_data,color=red,linewidth=2.0,linestyle=--)
8 Z2 B' K% P/ n5 R plt.plot(x_data,y_data2,color=blue,linewidth=3.0,linestyle=-.)
1 f$ N* P& B9 X3 d! B0 T& O plt.show()
0 p9 \& _0 p' P) @& N+ b) a/ e7 \8 }
" l& Y/ T2 Y2 _3 `# f, k; [5 d0 U * o& {0 j( N5 ~& m' t' m0 [; @0 R
注:说明:参数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 是指标记点,有如下的:
, ~9 G4 \# J3 A+ @& E% O) E
+ E. q+ `0 }5 b5 G1 v 3) 管理图例 对于复式折线图,应该为每条折线添加图例,可以通过legend()函数来实现。该函数可传入两个list参数,其中第一个list参数(handles参数)用于引用折线图上的每条折线;第二个list参数(labels)代表为每条折线所添加的图例 ) y1 q: ]: H0 M2 t) \% z9 M
import pandas as pd" ]6 p4 s: v1 l. C
import matplotlib.pyplot as plt6 q# T3 b% L& r2 t, k, {" j
& I, Q9 z! B+ |3 ^
#读取数据- R# @5 k ]$ K" H: G' O! s5 Y( I
data = pd.read_excel(matplotlib.xlsx)
7 ^ G6 S2 ]7 D& C3 B% c( p, Y% {, j3 W) \+ S
plt.figure(figsize=(10,5))#设置画布的尺寸
^# E: R) {4 S9 |" D3 m9 [ plt.title(Examples of line chart,fontsize=20)#标题,并设定字号大小( u) T( G' w; R* H) \; E
plt.xlabel(ux-year,fontsize=14)#设置x轴,并设定字号大小2 k- e- |# z0 y& F
plt.ylabel(uy-income,fontsize=14)#设置y轴,并设定字号大小
3 M5 c3 G$ s. M0 y' L' U4 x0 n" G$ t6 ?4 t5 [
#color:颜色,linewidth:线宽,linestyle:线条类型,label:图例,marker:数据点的类型9 S: W" `- k: q# c8 p
in1, = plt.plot(data[时间],data[收入_Jay],color="deeppink",linewidth=2,linestyle=:, marker=o)
$ Q5 z7 z3 G1 e3 c% N: l: `( t! Y in2, = plt.plot(data[时间],data[收入_JJ],color="darkblue",linewidth=1,linestyle=--, marker=+). u5 O: D- R9 h
in3, = plt.plot(data[时间],data[收入_Jolin],color="goldenrod",linewidth=1.5,linestyle=-, marker=*)
* w! l% P( ]# n; `/ E3 t! y: E
' E! T) ]/ j4 T* K1 W- c plt.legend(handles = [in1,in2,in3],labels=[Jay income,JJ income,Jolon income],loc=2)#图例展示位置,数字代表第几象限& P* _4 ^' d6 L! o# p( a( T$ H/ M* a
plt.show()#显示图像* D9 w. i/ k. h2 Q3 h7 L. W3 v
. J0 |( n. h* i! i
1 S( l0 Q- F" t, {% b$ I) R. E
4) 管理多个子图
5 r( V' S& b9 Z& I2 D import matplotlib.pyplot as plt
8 c4 W. j5 D0 t' H import numpy as np2 o9 `4 t+ G8 O0 N; U: S
import matplotlib.gridspec as gridspec
# w x3 W: B( I+ g import matplotlib.font_manager as fm #字体管理器' [. w% n8 [' {7 q" V1 r: U/ H
1 L! `3 A/ r+ G! [$ c my_font = fm.FontProperties(fname="/System/Library/Fonts/PingFang.ttc"). B" v- ^5 L- F+ W5 R
9 ~' e- V. y* n" I% [- n plt.figure()
0 P& y2 U% ~& _! a: A8 G, s% w. G3 b+ y# Z
x_data = np.linspace(-np.pi,np.pi,64,endpoint=True)( E3 B0 ~, b W+ ]
gs = gridspec.GridSpec(2,3) #将绘图区分成两行三列, s$ @$ F" l: o9 |0 P; e
ax1 = plt.subplot(gs[0,:])#指定ax1占用第一行(0)整行5 y+ T+ y2 y: ~' t- X
ax2 = plt.subplot(gs[1,0])#指定ax2占用第二行(1)的第一格(第二个参数为0)7 g+ d# T& \& g: v8 V+ `+ e
ax3 = plt.subplot(gs[1,1:3])#指定ax3占用第二行(1)的第二、三格(第二个参数为1:3): ^3 Y: e& X! U, q( e r
; y2 b4 a# l( q: W, q- y
#绘制正弦曲线% k' Z/ O" B: m& e" Y. G# s! x
ax1.plot(x_data,np.sin(x_data))* |1 i$ U I0 s- M; P I+ }3 V
ax1.spines[right].set_color(none)
% v9 ^+ T6 b8 }1 T0 f5 q ax1.spines[top].set_color(none)
/ {( A% R4 A% m ax1.spines[bottom].set_position((data,0))7 q4 `) [; l, T" B( W9 x
ax1.spines[left].set_position((data,0))# t _" }& R! p' ~! Y" _
ax1.set_title(正弦曲线,fontproperties=my_font)
9 ?0 y( |) g6 _0 Y
+ j! y7 z2 l9 K: t7 w #绘制余弦曲线
0 m" J) \# t: B) i: h! d7 l1 p/ _ ax2.plot(x_data,np.cos(x_data))& ?+ f/ i8 K9 D
ax2.spines[right].set_color(none)5 Y, z0 R v" T" B8 V
ax2.spines[top].set_color(none): q+ Y0 k. [! B0 [* c) Z( d9 [/ O
ax2.spines[bottom].set_position((data,0))0 ^! c2 q/ ^" a2 G6 s; X# U0 W3 i
ax2.spines[left].set_position((data,0))
; J5 Q B5 z2 V: z8 p$ x" j ax2.set_title(余弦曲线,fontproperties=my_font)+ u: d H) f! k. h
5 t9 J6 h) G# U5 M/ u/ e' X; d
#绘制正切曲线5 u# h% \8 H. p4 p; I$ B$ |
ax3.plot(x_data,np.tan(x_data))1 u' L5 z: o0 b% Y: ^1 P
ax3.spines[right].set_color(none) r& _( ]! g/ v3 o7 f; K9 N$ d
ax3.spines[top].set_color(none)! n4 {/ N' ?4 b7 N9 S' k c8 X h
ax3.spines[bottom].set_position((data,0)) H, Q- h+ e) {5 v% h
ax3.spines[left].set_position((data,0))
+ b, q, O; Y3 Q7 j# [- w# U ax3.set_title(正切曲线,fontproperties=my_font)+ w/ e$ |+ _6 u6 X& Q$ U, p
plt.show(): e2 d2 U; U4 h0 Z, _% s
0 \. s0 O. l+ m5 t
结果:
& y; X. p( ?+ H7 T8 k9 @7 P3 L P1 @ ) Z. i$ Y- s" n: j( G
6 S! `$ ^- O6 N" H" x& b9 R4 w! `
k1 N* p8 O+ C& l/ {% @3 s1 G* v7 l9 n* X
' h3 U' |/ L" b7 X! Q; V% D3 K- ~$ W0 J* l4 y. `/ X
|