|
' n& M) m7 v; {6 s9 ` d6 f3 B/ i
原创:宋宋 Python专栏 9 u8 R1 w' T0 t% K# e
来源:Python数据分析:折线图和散点图的绘制
2 ~6 D1 m# L, L& ]& V7 K 折线图
; c; J# I8 I7 |: c5 U. F/ [3 w 折线图用于分析自变量和因变量之间的趋势关系,最适合用于显示随着时间而变化的连续数据,同时还可以看出数量的差异,增长情况。
0 O: o* B9 W) p% M0 y Matplotlib 中绘制散点图的函数为 plot() ,使用语法如下: matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)1) 简单的折线图
- N6 e$ Q. W* P2 R" t8 x; K 在matplotlib面向对象的绘图库中,pyplot是一个方便的接口。
+ | V S5 ^* I4 B7 G O4 | plot()函数:支持创建单条折线的折线图,也支持创建包含多条折线的复式折线图----只要在调用plot()时传入多个分别代表X轴和Y轴数据的list列表即可。
+ X, K& b) k% H/ R$ @) Z$ R import matplotlib.pyplot as plt
7 s! C. |* y6 S' j
$ {" ^* n; `$ [+ j# w x_data = [2011,2012,2013,2014,2015,2016,2017]
' q9 A# ~0 w: A! y) y" d( ~ y_data = [58000,60200,63000,71000,84000,90500,107000]8 r, t9 t' ?1 ]: ~" Y4 G
8 q# F$ ^. I; X1 H& \* \! K plt.plot(x_data,y_data)6 a: M+ M" \9 P
plt.show()
( n# u/ D4 L6 r+ g4 K+ k* `
% Z+ d4 B _8 l/ Y
# u3 r0 M/ Z+ |5 ` 2)复式折线图: + x6 `# V8 Q6 L* U' r
import matplotlib.pyplot as plt8 p# c2 [, n, E) S7 [+ D! [: r
x_data = [2011,2012,2013,2014,2015,2016,2017]
7 J4 h9 _, F4 o1 R# y' K9 m y_data = [58000,60200,63000,71000,84000,90500,107000]
0 e6 l' o1 u6 d" @; N y_data2 = [52000,54200,51500,58300,56800,59500,62700]) W6 H; w* p" `! j8 ~, w
+ V, ~+ ]" `* o$ b3 q plt.plot(x_data,y_data,color=red,linewidth=2.0,linestyle=--)
4 h7 g8 r6 o9 c1 m+ J! ~/ m4 A, T plt.plot(x_data,y_data2,color=blue,linewidth=3.0,linestyle=-.)
& A7 D: M4 \$ n plt.show()
5 y* D. v" n& A' J8 N( s" |5 v% m & |5 B! D: h9 o# f. M V
) `- m1 s( Z0 G: X! T 注:说明:参数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 是指标记点,有如下的:
' M p! C d6 I, B 2 S9 f4 E: {4 [) C# V: Z6 W; ?
3) 管理图例 对于复式折线图,应该为每条折线添加图例,可以通过legend()函数来实现。该函数可传入两个list参数,其中第一个list参数(handles参数)用于引用折线图上的每条折线;第二个list参数(labels)代表为每条折线所添加的图例 W: b3 L8 {- b; `
import pandas as pd3 B, T7 M- K) ~/ |9 V3 e
import matplotlib.pyplot as plt
3 h5 a! s) t: t& R4 K8 J1 B
c& z) V8 r" A$ G0 g) w #读取数据: @) Y1 C% q; X
data = pd.read_excel(matplotlib.xlsx); v+ y# g7 v) ~5 U
* z/ @2 ~* I. P$ d' ]' U plt.figure(figsize=(10,5))#设置画布的尺寸
: }, [& J4 U! K: e( Z1 X0 b plt.title(Examples of line chart,fontsize=20)#标题,并设定字号大小
7 d5 c9 q# g/ U& I7 z6 {0 \ plt.xlabel(ux-year,fontsize=14)#设置x轴,并设定字号大小
9 X( v9 b* A1 U0 D+ b plt.ylabel(uy-income,fontsize=14)#设置y轴,并设定字号大小
/ ?) O- K+ B, l7 @0 W2 t$ L7 |( x
#color:颜色,linewidth:线宽,linestyle:线条类型,label:图例,marker:数据点的类型
9 M4 y x) ~& E- f" \6 g8 u in1, = plt.plot(data[时间],data[收入_Jay],color="deeppink",linewidth=2,linestyle=:, marker=o)
4 A0 S+ P2 y4 ^/ m in2, = plt.plot(data[时间],data[收入_JJ],color="darkblue",linewidth=1,linestyle=--, marker=+), g' P4 t& G8 s+ ?
in3, = plt.plot(data[时间],data[收入_Jolin],color="goldenrod",linewidth=1.5,linestyle=-, marker=*)
8 r, M! ]& |3 D3 j" M1 L W+ N0 }* O: _- S+ P- w: J6 D g
plt.legend(handles = [in1,in2,in3],labels=[Jay income,JJ income,Jolon income],loc=2)#图例展示位置,数字代表第几象限, |* E3 O, j+ V# x
plt.show()#显示图像
Z3 R, | W6 ~: ?$ D ( f6 @* F$ j1 a0 Y/ h6 J
! I4 E* \, s6 a ` 4) 管理多个子图
7 v6 L3 R9 x' b& ~# G import matplotlib.pyplot as plt- Q9 I! ] A/ W
import numpy as np
+ v7 Z& d! t; q! t/ s8 D3 O* i import matplotlib.gridspec as gridspec' Z( G4 N3 U* c9 I) O0 J
import matplotlib.font_manager as fm #字体管理器
- w( C' J3 m6 L+ E# q3 Y
/ ]0 H2 r" O7 {4 h0 a my_font = fm.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")
( c- _2 t7 Y( E3 ]. }# H( g
& A& h$ d' h( R6 T% b plt.figure()
0 O; V$ m( u5 A) N! U) Q& j/ s! Q
" M8 I- d! o3 E. g x_data = np.linspace(-np.pi,np.pi,64,endpoint=True)3 W C$ e- X$ @) T& `; }" ]
gs = gridspec.GridSpec(2,3) #将绘图区分成两行三列
* y- Y2 o% u7 @) [% d7 c7 I ax1 = plt.subplot(gs[0,:])#指定ax1占用第一行(0)整行
" i. K' m+ L4 E2 T* \2 i4 e. { ax2 = plt.subplot(gs[1,0])#指定ax2占用第二行(1)的第一格(第二个参数为0)
" x" z! p3 X7 i3 {' G# V% L ax3 = plt.subplot(gs[1,1:3])#指定ax3占用第二行(1)的第二、三格(第二个参数为1:3)* }! d% a' c" R; v' ^" I, w
( Z( Q. i( L5 v7 `9 R8 B- j
#绘制正弦曲线6 j7 s( V r/ g' i# r# P
ax1.plot(x_data,np.sin(x_data))
- h; M& Q8 \4 o S ax1.spines[right].set_color(none)$ @7 z0 H' {, N$ T( `. u
ax1.spines[top].set_color(none)
. E; }$ ~2 h1 p3 m% { ax1.spines[bottom].set_position((data,0))
+ O4 m8 d! X- ]* O ax1.spines[left].set_position((data,0))
! d1 J& B- P& `: Y1 W1 v9 f ax1.set_title(正弦曲线,fontproperties=my_font)
& h0 _% a+ b0 |$ R& @( t! w
2 E6 c! L! N% |6 M/ U: y #绘制余弦曲线
/ D6 p7 Y. g3 [$ X) Q, i ax2.plot(x_data,np.cos(x_data))) Y. y, x; M$ [ |: u3 I. `
ax2.spines[right].set_color(none)
4 r" y- H a- _6 }7 x2 F1 { ax2.spines[top].set_color(none)! d3 v% |* j8 x. R: ~$ `
ax2.spines[bottom].set_position((data,0))3 P l2 ?; L$ }! H
ax2.spines[left].set_position((data,0))
+ C' ?: b" J! P3 n ax2.set_title(余弦曲线,fontproperties=my_font), v# n9 ^$ o$ P: ^/ U
[# ? O7 V5 }
#绘制正切曲线
0 k9 e' H/ N4 G. z ax3.plot(x_data,np.tan(x_data))
( \' v- q! a8 k- Q ax3.spines[right].set_color(none)
/ G; o. H+ g* E: ~; i. F/ K ax3.spines[top].set_color(none)7 K; j2 y# A* V7 A" E) V9 _' @6 ~
ax3.spines[bottom].set_position((data,0)); C9 L1 G9 p# [ ]* g1 P7 A
ax3.spines[left].set_position((data,0))
" `- G% ]8 @! g) ]% Z3 } ax3.set_title(正切曲线,fontproperties=my_font)2 {+ m- e: H- V& `( ?1 U. q2 \+ G
plt.show()) T1 h/ O5 P4 O# F \" J( [& }
) ]( U5 N2 H5 F! J! k7 v
结果: , s7 j, f5 G9 j
' _! i% ]6 _* b
+ \: N. {2 B- ? g- W I" y- |* w
$ S8 L! N% H# a! w6 p5 ~) _( a i) w
! ~2 { T8 _- P2 y' r$ F
2 g- a' y& I y5 \& m2 a8 h6 V |