* _. T5 W+ C9 q" | \5 [& Q
在我们科研、工作中,将数据完美展现出来尤为重要。
5 @# D* t2 \3 J) V6 B* [4 \ 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
2 X3 w. W6 B B1 }+ ]6 ~. h: L 下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
5 h S" i: j6 ^ Example 1 :散点图、密度图(Python)
U& H. ]" g$ z! [" z" ] import numpy as np
1 T# |- h) `8 \: \7 H5 s import matplotlib.pyplot as plt
$ l# j% q# Z) @5 V | # 创建随机数
% T+ [3 U' D% a T2 Z( h
n = 100000
) K0 l( S" F) m$ D ]) y x = np.random.randn(n)
& r$ y; I$ m+ H) d" ]5 u7 { y = (1.5 * x) + np.random.randn(n)
" P0 W: F2 f* ^9 u0 N fig1 = plt.figure()
5 `/ T+ k0 i" ?: {8 i# I# K, w
plt.plot(x,y,.r)
0 D1 _. \% E2 ^0 G! M8 q
plt.xlabel(x)
( ]+ w7 L& M. U1 ?3 Q% f T plt.ylabel(y)
* L- Z3 I p! x6 A7 J& ?1 ?& u: ? plt.savefig(2D_1V1.png,dpi=600)
! s; F: H- p8 A- @ nbins = 200
# s% y4 n0 B- `5 ]
H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
; x8 \) I* _3 [& Y+ [1 u # H needs to be rotated and flipped
" |9 R% T3 O/ S8 R4 b) L8 I H = np.rot90(H)
1 x; c( y2 s/ S
H = np.flipud(H)
$ w/ r, L# U& b( {8 ^ # 将zeros mask
/ \- Q) x) F% v Hmasked = np.ma.masked_where(H==0,H)
# t% S) O: G! V$ L- h
# Plot 2D histogram using pcolor
) M2 ~* {2 H) e/ z ` fig2 = plt.figure()
) ^" s! P/ u7 s3 J4 c% H
plt.pcolormesh(xedges,yedges,Hmasked)
; Y) W" N- k M$ y5 H9 Z0 I* D, t
plt.xlabel(x)
& ~2 @* p1 V- ]. z- Z
plt.ylabel(y)
8 \; ~4 L% i5 c5 u8 }/ C
cbar = plt.colorbar()
+ r- C; k" \. N, C3 ~& c' F0 w cbar.ax.set_ylabel(Counts)
" s$ h+ V; y8 y3 d* \
plt.savefig(2D_2V1.png,dpi=600)
9 |" M- W- p; z! Z plt.show()
6 F# M. g& O6 {& W' `( R
C8 \8 _3 u$ H$ s2 G0 A# J
5 Y) J# b7 i! F9 u5 K 打开凤凰新闻,查看更多高清图片
; k6 u. n, f+ `; I9 u$ b" [
- J2 _" O0 X" j- t2 Z. g6 i
6 H6 n% D" t- Y6 A. k5 j

0 t% X7 r4 i: e
Example 2 :双Y轴(Python)
9 g* [: G" g( }$ I3 e: B import csv
9 o% x) D, X e4 i" b, e9 W3 D
import pandas as pd
' c# T2 l# s/ V: O. W( B
import matplotlib.pyplot as plt
( f7 N3 a/ o8 K0 ? from datetime import datetime
: M& y5 }2 p+ W- ]
data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
! d. a: d# ~* n time=data[date [AST]]
9 w) w9 a' q+ _4 J4 v9 Z
sal=data[salinity]
% G2 D) M. p) f6 f! H5 V! s
tem=data[temperature [C]]
9 M$ @8 v8 J. E% F: ~" u
print(sal)
; J* @( ?( Y) O4 E! \7 d
DAT = []
& f+ l5 ^; S( m8 K# p7 R4 R
for row in time:
8 C ^# ^% y" [0 A5 `& t. g+ B! L
DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
. f+ h- P5 ~2 O- Q( J% p #create figure
& q# F" h' P1 e$ v fig, ax =plt.subplots(1)
0 g5 e" g$ S5 ]$ z7 p1 |/ G9 x
# Plot y1 vs x in blue on the left vertical axis.
' }0 @% }; q# G9 @( D m. M plt.xlabel("Date [AST]")
4 `( k( ^0 u3 @9 z. v Q! X
plt.ylabel("Temperature [C]", color="b")
3 w9 v B! g2 y: ? plt.tick_params(axis="y", labelcolor="b")
" B- {% y3 p" l$ d+ {! C/ l; w' F% i
plt.plot(DAT, tem, "b-", linewidth=1)
8 H. \+ Y. {; g6 d6 d. }5 R plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
! i, A' N. L: x- ^. u0 d1 m7 D& m$ J
fig.autofmt_xdate(rotation=50)
9 c1 `( k0 G6 b* n! j
# Plot y2 vs x in red on the right vertical axis.
! ~1 {& {& V1 L# P) Y plt.twinx()
1 U: S$ A, E2 F6 r- O
plt.ylabel("Salinity", color="r")
9 W$ E# E" z# i+ B plt.tick_params(axis="y", labelcolor="r")
, W) I0 q$ n. g/ T Z9 M4 x6 V plt.plot(DAT, sal, "r-", linewidth=1)
3 S# p! a3 `* e- o/ C3 ]7 ]
#To save your graph
; M1 ?. v- m1 K% E
plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
1 ^3 W* D! d$ h" p" o+ d plt.show()
9 d _2 [0 g6 t6 p1 b 
* u# f4 W( l6 J- h" x Example 3:拟合曲线(Python)
[% o# u' v, ~, }: ]0 L import csv
! ~" |- Y9 C2 N& K1 g: Y/ b import numpy as np
: s8 \: ~/ n1 A# g2 l/ v import pandas as pd
C; ~. q R0 [! ]- |0 Y from datetime import datetime
) X: C$ t% a' \8 f import matplotlib.pyplot as plt
) r& G( _" o: q/ H
import scipy.signal as signal
/ {+ s1 W% m+ n1 W* Z8 q
data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
; c/ Y) N+ N' v" {- A* z+ c time=data[date [AST]]
' ~. C& ?! N! Y1 [1 u$ \5 E0 c' m
temp=data[temperature [C]]
" i! j( j, q) l" t; ?$ h$ g3 F$ j
datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
) M0 z4 E/ m O% ]+ \ DATE,decday = [],[]
/ z3 V& k+ @# k# i) T7 I
for row in time:
5 k& ~3 ]" R, P+ g' g# a daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
7 A- {) |' a! [ DATE.append(daterow)
9 F1 ~8 V0 w; ?7 R+ K: V decday.append((daterow-datestart).total_seconds()/(3600*24))
% G8 X! W5 ^! ]. c+ O) A # First, design the Buterworth filter
$ |' `5 }: x" v% i
N = 2 # Filter order
2 \0 p% I& M/ f3 o4 m) |
Wn = 0.01 # Cutoff frequency
5 K# |; H: z7 o1 j5 f B, A = signal.butter(N, Wn, output=ba)
e3 ?# @, h, [2 C Z" D # Second, apply the filter
8 I8 s; ]- U6 Q G; C$ Q+ z
tempf = signal.filtfilt(B,A, temp)
* P/ `( I6 e% S # Make plots
G2 R( O9 W' q2 Y fig = plt.figure()
. T" X$ _* F0 q ax1 = fig.add_subplot(211)
9 \9 o8 h/ H4 _- m, A0 }0 P plt.plot(decday,temp, b-)
8 X2 ?, e" X- N* j plt.plot(decday,tempf, r-,linewidth=2)
( B ^: y( Z3 R# X) [5 z4 R
plt.ylabel("Temperature (oC)")
+ P) V8 I' k1 Q7 w: x
plt.legend([Original,Filtered])
* {' R, }# g9 f+ O8 g" d! L plt.title("Temperature from LOBO (Halifax, Canada)")
7 Y2 v0 F, `/ }
ax1.axes.get_xaxis().set_visible(False)
; w6 d1 L9 }1 |! a) t( t- U, @ ax1 = fig.add_subplot(212)
# e& I/ S! Y7 X y, T
plt.plot(decday,temp-tempf, b-)
; T& b, ^) N# w/ A( `- c
plt.ylabel("Temperature (oC)")
5 S7 f+ o2 W2 Z plt.xlabel("Date")
2 ~$ A! b6 Q o q' v plt.legend([Residuals])
3 I6 M) @" l$ H1 n6 Q
plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
2 O/ l# I w4 H* e
plt.show()
; t) h& m+ X8 [- k 
0 f- ], R4 _! E+ W/ b Example 4:三维地形(Python)
9 s6 @3 ^# f1 ^) f& o0 }3 e
# This import registers the 3D projection
. b1 ?6 V+ L8 a% t, U from mpl_toolkits.mplot3d import Axes3D
& W5 B/ g6 k( k from matplotlib import cbook
6 f$ C, {; l0 G' H/ H& i2 U from matplotlib import cm
3 E+ C1 U1 A$ D+ q' }' x j$ H from matplotlib.colors import LightSource
. \: o" n; M# u' }( ?1 W6 c' ^
import matplotlib.pyplot as plt
/ F" Z( J& P2 e- F3 v# Y4 O) ?/ O import numpy as np
+ q8 V# e* n- g. g$ U: m filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
+ W5 D0 _' b5 K6 j% q with np.load(filename) as dem:
. ^# L/ ?" y8 @' U1 L& d, A; E z = dem[elevation]
0 p: ~ j) A) R1 |& I+ k nrows, ncols = z.shape
/ P! a% X# V; O0 U
x = np.linspace(dem[xmin], dem[xmax], ncols)
2 ]* A1 H1 F# s5 ? y = np.linspace(dem[ymin], dem[ymax], nrows)
3 O! e* e1 n, Z" x; ?& \
x, y = np.meshgrid(x, y)
6 K: n5 G; s( m. k9 ?' I* C! n region = np.s_[5:50, 5:50]
4 J' t3 t5 W( M3 J1 H! A7 ?! ]
x, y, z = x[region], y[region], z[region]
) E, i, v( f, N1 i H2 w, H fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
, A! N: F" S' y ls = LightSource(270, 45)
; _5 e5 `- K2 W- Q1 e& c rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
" f) ^. {5 r) W1 ^# x T+ X* q% F
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
8 R: v9 K& O) |- _+ ?5 C1 X( O linewidth=0, antialiased=False, shade=False)
- @9 T# m$ n4 W% N& Y% }
plt.savefig(example4.png,dpi=600, bbox_inches=tight)
4 m1 i8 C7 C. n& D plt.show()
% I2 t4 S( ]$ s2 [
4 m! F3 T) c2 g* F9 c Example 5:三维地形,包含投影(Python)
, }' q- n6 O3 m ; i6 M2 [3 b0 e0 Q
Example 6:切片,多维数据同时展现(Python)
& D6 Y) d) z3 z7 X* s9 f
9 t9 A& I. J' _3 T Example 7:SSH GIF 动图展现(Matlab)
5 T0 b. O2 u, F$ l
6 ^) y0 K* A' V" B0 t Example 8:Glider GIF 动图展现(Python)
$ r0 o0 p0 m% m: X/ E
; L- g. h6 u4 I" r# B6 s8 q Example 9:涡度追踪 GIF 动图展现
- N7 e. w3 b' l
2 d( y6 }$ A% q1 q