|
! r1 B2 e9 }4 K5 G; _# [* Q 原创:宋宋 Python专栏 7 Q6 o( M7 {4 p; ]1 {$ a4 M
来源:Python数据分析:折线图和散点图的绘制
5 A' ]/ [1 `" Q0 h- q 折线图
$ o/ S6 ~2 J ~3 A, U* @9 @0 w2 u 折线图用于分析自变量和因变量之间的趋势关系,最适合用于显示随着时间而变化的连续数据,同时还可以看出数量的差异,增长情况。 3 O% p+ H8 d5 X5 m; D& V
Matplotlib 中绘制散点图的函数为 plot() ,使用语法如下: matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)1) 简单的折线图 1 x5 ~ m# [" I) Z& U
在matplotlib面向对象的绘图库中,pyplot是一个方便的接口。
- H2 L6 z: w% y; p plot()函数:支持创建单条折线的折线图,也支持创建包含多条折线的复式折线图----只要在调用plot()时传入多个分别代表X轴和Y轴数据的list列表即可。
* k8 N" N; \5 p0 B) S: U import matplotlib.pyplot as plt/ u3 N5 G1 v* m
+ V1 {9 o. \4 S% L$ g, i* Q
x_data = [2011,2012,2013,2014,2015,2016,2017]% }# [# E- h) o5 L# e
y_data = [58000,60200,63000,71000,84000,90500,107000]% [ P5 y5 r* r
9 I8 q6 E0 R5 N$ Q8 m/ P6 D! a
plt.plot(x_data,y_data)
8 H! c% A _6 h \+ Z0 Q plt.show()$ o4 M% n/ M) Y, g
, Y0 }/ D. w) w9 `4 Y& h5 F) P
; Q( E3 j6 p Y& I& z/ H n 2)复式折线图:
, x* a3 M, Z7 E, d6 Q$ Z9 D4 z import matplotlib.pyplot as plt# N1 H& r# ^7 t3 Q
x_data = [2011,2012,2013,2014,2015,2016,2017]
8 `% T; y2 X: }& g) ] y_data = [58000,60200,63000,71000,84000,90500,107000]
& ?7 G# \" q* \- d; ^8 C y_data2 = [52000,54200,51500,58300,56800,59500,62700]
* o3 [, u' c1 g: f5 s
, C' \+ g# C' i- N3 E0 y plt.plot(x_data,y_data,color=red,linewidth=2.0,linestyle=--)
2 Q5 r. r* z% d8 [7 l plt.plot(x_data,y_data2,color=blue,linewidth=3.0,linestyle=-.)
$ F6 N3 J% {2 S$ A3 r. M4 I7 J" R plt.show()
+ v4 A2 ]3 e2 |* I
1 k; n' a f6 d5 a8 f # y Y k6 ]$ _) ^: `
注:说明:参数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 是指标记点,有如下的:
' i9 L. v& z ?; l2 F4 P
! |, O5 ] u$ d- E 3) 管理图例 对于复式折线图,应该为每条折线添加图例,可以通过legend()函数来实现。该函数可传入两个list参数,其中第一个list参数(handles参数)用于引用折线图上的每条折线;第二个list参数(labels)代表为每条折线所添加的图例 0 x7 ~& r, S8 F( F" e& c
import pandas as pd
9 j$ X+ s( z4 }* r import matplotlib.pyplot as plt, S7 i, y- w0 n' d2 X$ H& Y
4 Z! i/ m) g G! L5 v/ p
#读取数据) V0 w/ I1 j# D- N
data = pd.read_excel(matplotlib.xlsx)8 m1 I7 ]) V7 L u0 L: N2 Q9 E
4 @, ?$ Y0 T( q. s plt.figure(figsize=(10,5))#设置画布的尺寸( }: m/ e- R' a4 U! d
plt.title(Examples of line chart,fontsize=20)#标题,并设定字号大小
3 X) N; j2 T# F8 O! b9 q, |" b- I2 w plt.xlabel(ux-year,fontsize=14)#设置x轴,并设定字号大小& X: a0 @9 _5 [; Z
plt.ylabel(uy-income,fontsize=14)#设置y轴,并设定字号大小4 h: l% _3 w# z h% d
* r7 a6 x9 k; \4 P #color:颜色,linewidth:线宽,linestyle:线条类型,label:图例,marker:数据点的类型" C# k$ K+ _. k. C( y1 x
in1, = plt.plot(data[时间],data[收入_Jay],color="deeppink",linewidth=2,linestyle=:, marker=o)# a! X6 w% r, Z; I3 `8 f4 @
in2, = plt.plot(data[时间],data[收入_JJ],color="darkblue",linewidth=1,linestyle=--, marker=+)/ o% D( g+ H; R' v
in3, = plt.plot(data[时间],data[收入_Jolin],color="goldenrod",linewidth=1.5,linestyle=-, marker=*)4 J1 E% D( |: |+ n# y- X# k) O
+ N3 e6 i/ ]7 |3 J/ g
plt.legend(handles = [in1,in2,in3],labels=[Jay income,JJ income,Jolon income],loc=2)#图例展示位置,数字代表第几象限& B% f( o/ H0 J2 \, L7 T) @
plt.show()#显示图像; d* X& N# a# R9 k" t
+ S; b, c. y: Q% m1 D, ^( k/ f 6 V5 k' Y$ V$ q' K
4) 管理多个子图
! @' k" z% i7 h8 @! w5 @1 G import matplotlib.pyplot as plt" ^5 E4 ^5 c3 z9 Z! Q+ Z7 {, h
import numpy as np
1 B4 f j+ p' g+ R! u import matplotlib.gridspec as gridspec
9 ]" a* {, t4 s6 Z2 `$ k import matplotlib.font_manager as fm #字体管理器
6 k5 r: `, p7 c
+ x5 Q7 V! C+ K7 H) y my_font = fm.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")# w6 B1 V8 U) N4 f
0 @( O! i+ }9 u) |. ]& p6 ^5 ~& \
plt.figure()
6 i2 z% D6 k( r0 J0 Y) ~# H* p4 @" H; N
( l7 ^% n; f# A- _5 } x_data = np.linspace(-np.pi,np.pi,64,endpoint=True)/ ^9 g# n) L2 T' S2 @& [
gs = gridspec.GridSpec(2,3) #将绘图区分成两行三列9 E! \/ M! j6 Q0 o
ax1 = plt.subplot(gs[0,:])#指定ax1占用第一行(0)整行
$ Z! ?3 s# J2 o% z( y ax2 = plt.subplot(gs[1,0])#指定ax2占用第二行(1)的第一格(第二个参数为0)
9 o( e; R- K" m/ |" v ax3 = plt.subplot(gs[1,1:3])#指定ax3占用第二行(1)的第二、三格(第二个参数为1:3): P& X4 j1 w$ f5 [5 V
+ Z% g5 r9 s, N1 f& f
#绘制正弦曲线
8 m. ~# I' S! \7 K V ax1.plot(x_data,np.sin(x_data))
; h9 i4 X- P2 y; M' u ax1.spines[right].set_color(none)+ W' K: G* \6 q& J; [& j2 t
ax1.spines[top].set_color(none), O' H8 x" Y: U; }& V1 y
ax1.spines[bottom].set_position((data,0))
: a* {' ]+ |) P! P+ k. c ax1.spines[left].set_position((data,0))
$ x7 }8 I% e4 d) w. s ax1.set_title(正弦曲线,fontproperties=my_font)# k/ k# p) f0 [: {0 p, x8 y
8 H3 c$ j% W* R$ N, z5 i #绘制余弦曲线# P( G! X( ~3 S; N8 Q1 L1 W
ax2.plot(x_data,np.cos(x_data))
0 z4 j M# D- S, R/ i ax2.spines[right].set_color(none)4 X" |; W0 X4 U+ g$ E
ax2.spines[top].set_color(none)0 q- k: \# f, D3 o+ \
ax2.spines[bottom].set_position((data,0))7 T+ P1 e$ `' ~' [+ h' e7 b# K
ax2.spines[left].set_position((data,0))
/ J1 _" m- m9 h1 _% x& A ax2.set_title(余弦曲线,fontproperties=my_font); K/ T) [' S" Q. R1 W& S5 R" d: k
7 \+ W& w. A3 I8 |2 g* p3 i' ^ #绘制正切曲线
+ j1 N, `1 f+ _3 Q* h$ k( Z% { ax3.plot(x_data,np.tan(x_data))
6 h# L* I9 B! {- z& [! n. o' A& K ax3.spines[right].set_color(none)
1 q. d4 P' N5 _. S' ? ax3.spines[top].set_color(none)
, w3 c7 Q- x3 R" _( S* t ax3.spines[bottom].set_position((data,0))* U! C* x0 q" Q8 y: J4 B; i7 D
ax3.spines[left].set_position((data,0))( c; g1 Y7 B/ z
ax3.set_title(正切曲线,fontproperties=my_font)1 ]4 I/ y4 z1 A# s, U
plt.show()
, L# U+ H% y4 D5 C" P8 l
. K9 l* k* @% n" J; \ 结果:
" m4 y" C8 _# D/ X" [ & F: r" U* q' M% E5 O o
I1 K$ ?. ^$ y. K( H$ e, y
1 X0 [$ u/ h6 J j+ W; F' G( ^" x2 X, B3 Q( e
' r. a" g& D- p8 G! z" e' }" B5 j
1 \; m! l1 f1 y: [" K8 l |