; u) c$ ]. e2 Q, n4 Z3 D 在我们科研、工作中,将数据完美展现出来尤为重要。
6 ^, j5 C1 X3 `9 g k* d* {+ M 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
, r9 d$ j$ e0 Q0 z3 g! s; c
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
5 |" P' G& [. Y/ K" P0 j Example 1 :散点图、密度图(Python)
; B) [# h S3 c% y import numpy as np
8 R# F7 U; ^; P8 A5 h% u
import matplotlib.pyplot as plt
3 j( k( T- _% y. t/ m I
# 创建随机数
2 _2 Q% y J; v" N
n = 100000
5 C S1 w. B5 K2 ^( J8 c
x = np.random.randn(n)
' h+ B# @! p8 M y = (1.5 * x) + np.random.randn(n)
/ d/ e& j1 E$ X! Z! }1 s fig1 = plt.figure()
5 J& x$ p* v0 d3 x6 S/ N3 I1 x plt.plot(x,y,.r)
: ]& y+ ~3 _- Z' @. o- G plt.xlabel(x)
0 C, S/ X, n4 u* [: B. [ plt.ylabel(y)
+ |- L! `' n% ~: A; {+ l9 h. l
plt.savefig(2D_1V1.png,dpi=600)
7 Q5 ~! a! L2 e& q i+ p% b
nbins = 200
9 l' a- [# Z! }! v( G- D
H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
& o1 w2 ~; {2 l* z
# H needs to be rotated and flipped
; o3 l& g8 ~4 u/ H8 X H = np.rot90(H)
1 K% l9 u4 V u" F
H = np.flipud(H)
# o' h3 M: f/ m) d& T
# 将zeros mask
& g9 \4 k- m3 v* c6 a$ l; j) `+ j
Hmasked = np.ma.masked_where(H==0,H)
3 y& \: R. z6 L# j7 Z5 L4 [* y
# Plot 2D histogram using pcolor
$ X I9 E3 F9 b0 F# { r# h4 F fig2 = plt.figure()
* q: d9 m; R2 q+ w' ^7 Y4 |
plt.pcolormesh(xedges,yedges,Hmasked)
' B* s7 g, _2 p, j- _
plt.xlabel(x)
/ p. [3 o- F3 Y N% I( Z8 X
plt.ylabel(y)
" U& v* O1 U1 l4 Z* _& Q! P6 F$ }
cbar = plt.colorbar()
% ?/ M( Y' D4 X cbar.ax.set_ylabel(Counts)
% @' k, O; P9 ^
plt.savefig(2D_2V1.png,dpi=600)
/ q# N/ G5 H% e) e$ o
plt.show()
! L( d5 X J- m# m" x- N1 |0 L9 z+ L
" L u6 o6 t: f# s5 B- x. ^% ] L
3 v5 z- W% M/ u2 o) J- M 打开凤凰新闻,查看更多高清图片
: l* A7 r+ e$ p, x @
* T9 K' m/ i: W$ n2 Z
+ Z' o6 B) i3 F$ f

7 Y- g! i' J% h* P& B
Example 2 :双Y轴(Python)
# N. J; m J: T& D import csv
8 i+ G F/ x5 n import pandas as pd
0 {" E7 B h$ S/ u
import matplotlib.pyplot as plt
: z' K& k0 W4 j9 d from datetime import datetime
4 n- c% ], [" M: L8 c3 ?. ? data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
4 s/ x6 D _9 S& i1 w) ]6 {4 ] time=data[date [AST]]
/ N/ j: O- `2 T9 l( }$ R7 R4 D
sal=data[salinity]
# p, C7 t" z# c
tem=data[temperature [C]]
$ s8 J7 ?2 ]3 `* u6 a
print(sal)
1 [. B# G ]0 B1 G9 L; Q
DAT = []
" _/ ~; {: u" G: a4 r1 O# a for row in time:
0 z# a( w0 o- o: a DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
, [0 u2 O4 k: `' s; C+ x# J8 P7 _
#create figure
( D1 ?. K7 `: Y3 S fig, ax =plt.subplots(1)
; Z/ a7 S. X# R- c' B p9 j4 |$ i # Plot y1 vs x in blue on the left vertical axis.
) F6 H5 f M7 v5 n plt.xlabel("Date [AST]")
- I" \; H9 ]; I0 B7 u+ o8 H: T
plt.ylabel("Temperature [C]", color="b")
1 A1 ^! Y. C! j7 c) b* i5 q: s
plt.tick_params(axis="y", labelcolor="b")
" {3 ?" M1 X2 D# @" j plt.plot(DAT, tem, "b-", linewidth=1)
: h4 `* _( M2 Y5 n# b2 U. y plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
; r; l* P% S4 e
fig.autofmt_xdate(rotation=50)
2 D/ A" G- e5 B2 ]
# Plot y2 vs x in red on the right vertical axis.
0 K* C0 |8 c7 W! q$ v4 j
plt.twinx()
. @: }+ x5 ?3 W( i* @, ]$ t) b
plt.ylabel("Salinity", color="r")
3 z) s2 J' ^9 p+ G# Z! z5 L
plt.tick_params(axis="y", labelcolor="r")
! ~ T' l! H2 [' j: e% z3 t4 q/ [+ j
plt.plot(DAT, sal, "r-", linewidth=1)
9 q' v6 `( U1 N* B! O2 F #To save your graph
7 A& g* `$ b3 T& D" m* a plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
% G/ n6 ]& ]- C* N* F. U
plt.show()
" s: D+ Z7 L; [3 j- @ G 
( O0 }/ x' S4 Z# B6 z
Example 3:拟合曲线(Python)
! }' J. K4 l) x6 f2 D" U* P' N' r# U8 z
import csv
9 `# o+ X: q! j1 Z. @' f0 _6 b import numpy as np
- Q6 t. a& A% ?
import pandas as pd
1 _ j& S3 L. K" ^! {
from datetime import datetime
/ o) v( @# g p4 k4 O
import matplotlib.pyplot as plt
' J' t* D. d2 L+ h- ]2 J1 a
import scipy.signal as signal
8 {: s$ C) g# l! Y4 V
data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
% v# l$ F+ ]* u9 s' I, b; ~% M time=data[date [AST]]
& v( Y4 p& o9 z: D9 O! n& T3 b
temp=data[temperature [C]]
0 D& p0 a3 _, c! B+ j3 f5 w1 i datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
! E+ @# ^) ^: K$ o DATE,decday = [],[]
# ? N1 i# H$ R7 C2 c# B for row in time:
9 L$ t6 I9 o% Z! M3 M
daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
. N8 U+ I$ Z6 f' s; W
DATE.append(daterow)
7 } @; v5 r* \0 Z decday.append((daterow-datestart).total_seconds()/(3600*24))
- `8 A( j( L) j' \- [0 L # First, design the Buterworth filter
7 r) o+ |* f$ {1 T- S# _! T N = 2 # Filter order
: C, e- g. E; S! P# @( K Wn = 0.01 # Cutoff frequency
# n* T; R6 @. I0 i- K
B, A = signal.butter(N, Wn, output=ba)
9 q/ d! b( J# h _
# Second, apply the filter
0 b( R& C2 J: W' }9 N4 K3 V tempf = signal.filtfilt(B,A, temp)
' p/ [' W1 z2 z$ j* p, k # Make plots
1 x) q$ O% q+ ?2 ~
fig = plt.figure()
% R% C( N4 F$ g+ }
ax1 = fig.add_subplot(211)
7 f7 z0 M& X" R, b6 K) E+ l
plt.plot(decday,temp, b-)
% p- y* g% l0 g7 _ plt.plot(decday,tempf, r-,linewidth=2)
c8 |8 o% L6 Y( H" l) h
plt.ylabel("Temperature (oC)")
# M( `" o8 g+ \) K$ U plt.legend([Original,Filtered])
7 E2 X; S' r1 @; \
plt.title("Temperature from LOBO (Halifax, Canada)")
1 m0 P! h/ f' f* w5 { ax1.axes.get_xaxis().set_visible(False)
8 E! A, v) p$ n6 q/ C2 [+ |: s ax1 = fig.add_subplot(212)
) P9 y: E: J3 P9 ~$ _ plt.plot(decday,temp-tempf, b-)
- h% d# r5 r8 A$ F5 o plt.ylabel("Temperature (oC)")
& l t( f- u2 X+ ^# i* R plt.xlabel("Date")
) z4 Y4 ?6 |2 H4 ~% ~/ y
plt.legend([Residuals])
, W. p- g& r9 h) [! t
plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
% l3 e& G6 P) j( e% k% u3 U
plt.show()
. u0 E6 }! z- `9 p9 E

; D- f, e7 n9 o$ J2 ~1 C B( K Example 4:三维地形(Python)
( X. @( D1 U8 @
# This import registers the 3D projection
/ y# G. x7 w* Y$ L3 V, g from mpl_toolkits.mplot3d import Axes3D
a% H: g% A; j& N8 o! R) ~
from matplotlib import cbook
3 h- `" g% I6 ` V
from matplotlib import cm
1 R, U% Y9 W' ~6 \- U# E D+ i from matplotlib.colors import LightSource
" Y2 ?0 k7 G( P& H8 p+ ]
import matplotlib.pyplot as plt
. D/ X; R2 _( @# Z& r import numpy as np
$ b* V1 E. z+ U! y+ N filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
# l+ w! G$ ~$ g& W
with np.load(filename) as dem:
' j6 S( A! p- v7 a& y8 s: x# A' F5 |
z = dem[elevation]
6 ]8 p/ o7 N9 |2 \
nrows, ncols = z.shape
/ Q% I; j- g- b; a* z
x = np.linspace(dem[xmin], dem[xmax], ncols)
; N0 f: ^- z) t( L! d
y = np.linspace(dem[ymin], dem[ymax], nrows)
' h$ B! c4 k( G1 s x, y = np.meshgrid(x, y)
6 r8 | l7 ]" |, Q6 L, R region = np.s_[5:50, 5:50]
$ |9 d4 P- u0 }; a. T x, y, z = x[region], y[region], z[region]
4 T% o+ ^4 Y, h
fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
# H: W$ q, e7 b. K3 l" H
ls = LightSource(270, 45)
; r) G! f3 v) j$ ^- n rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
E0 }6 }1 I r2 R5 b1 ]& g! H5 X surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
7 K# v& l/ A) g0 q* s linewidth=0, antialiased=False, shade=False)
- F9 D2 a5 x# J' G6 p, |
plt.savefig(example4.png,dpi=600, bbox_inches=tight)
- q; e% A! q( @% y plt.show()
: w W7 w- m9 A+ z/ c 1 l- B) w3 u9 G2 T' G
Example 5:三维地形,包含投影(Python)
% I$ k/ N- D0 i$ g
7 k' O- `) _$ B* D+ n2 W! I+ i1 T$ p
Example 6:切片,多维数据同时展现(Python)
; C9 w" y3 L+ m0 j 8 N2 z) K6 O ?
Example 7:SSH GIF 动图展现(Matlab)
/ ?6 h$ a9 Z. g$ n% X( w, G( w
4 K* O- I" M9 t S* T! f. t
Example 8:Glider GIF 动图展现(Python)
- `1 c4 m; M- B# M5 Z# U; q# V
1 M L Z$ `8 B4 M, N# R
Example 9:涡度追踪 GIF 动图展现
' E! K& _+ W4 c( T7 S
# ]; u0 ]/ j; X