( ^. s, E4 P' c- G0 M' W+ S+ Q
在我们科研、工作中,将数据完美展现出来尤为重要。
6 Q4 V: Z. H" T3 ?& G, T, J" e 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
6 G1 u4 y+ _4 q! p: {+ N# G! d
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
8 U# I0 a! ]+ b7 t6 l# l) p
Example 1 :散点图、密度图(Python)
! n N" f; _: o9 K4 e% f
import numpy as np
6 c2 o7 I# K! p; f$ p6 B2 ^3 a import matplotlib.pyplot as plt
& \/ @1 C3 U% I J6 w
# 创建随机数
8 O, M6 f' ~$ ]/ q n = 100000
* D4 y8 Q/ W3 a8 Q6 t+ Z4 [. I x = np.random.randn(n)
5 w9 B7 |: f) j" x y = (1.5 * x) + np.random.randn(n)
- P6 L+ M6 T' z6 |( ]; v- c
fig1 = plt.figure()
3 v1 k4 f% _# N- h6 \2 r# Q3 O plt.plot(x,y,.r)
$ N8 N1 p* G p: p8 s( } X1 d8 M" k
plt.xlabel(x)
" _/ S7 p& A/ _, F5 ~7 M plt.ylabel(y)
. a- L/ R5 T# ^
plt.savefig(2D_1V1.png,dpi=600)
2 o/ L1 J% [9 z. X9 K nbins = 200
6 X& Q8 E8 o; [6 N/ ?3 ^
H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
5 T* d) t3 ^ Y& V: g) g
# H needs to be rotated and flipped
) Z2 }) H. C4 z* {5 s- t: l
H = np.rot90(H)
- i3 d! |4 \( B) X! ?# F. J, G+ {( Y
H = np.flipud(H)
/ w5 t8 G8 b8 _" O/ z& a
# 将zeros mask
2 a+ D4 z L, X5 o9 W5 k/ y Hmasked = np.ma.masked_where(H==0,H)
2 t; e: E* ~1 q1 a0 G' T+ w+ n7 r # Plot 2D histogram using pcolor
# f8 ]: c0 d, }$ I fig2 = plt.figure()
9 V+ I. I5 a2 C; t7 P plt.pcolormesh(xedges,yedges,Hmasked)
7 e7 F7 T+ } r' d3 s$ u" q
plt.xlabel(x)
$ O( N l2 W! M7 c plt.ylabel(y)
7 x- o% X6 M) w6 G: P. V; l cbar = plt.colorbar()
9 h! J; f$ [! d
cbar.ax.set_ylabel(Counts)
. x. _9 Z% |$ Z- Q
plt.savefig(2D_2V1.png,dpi=600)
& V5 D; x! p$ D, e2 F5 O# Z j) E plt.show()
: h$ A+ |. C5 } d! C
: k, f |% Z# D
8 ]% o) E( N: b7 n% L: ]& J 打开凤凰新闻,查看更多高清图片
y, k# T5 R3 E% M
* ~' F& E% W2 t2 g5 ~% w- V
3 R& `* o: `( S8 o$ N 
3 [. K. p( `2 L. X0 R2 O
Example 2 :双Y轴(Python)
- P7 f9 e% H5 a! M) F( o3 _ import csv
; S) Y) s- v0 \" N) U1 Y5 `+ m4 @4 E import pandas as pd
! `" M; M$ o3 k' H6 ^
import matplotlib.pyplot as plt
7 Y0 T" E5 u# j from datetime import datetime
+ E. i7 `2 B# {% T1 w* e: F
data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
) Q5 t2 B! U* o time=data[date [AST]]
# d1 m* |4 g' H0 A8 [7 U$ R$ t
sal=data[salinity]
) x5 T) P# B2 P# L* v# f, f! q tem=data[temperature [C]]
! }2 f% v% i @0 k$ _
print(sal)
0 `9 F# ]% k5 u( x! L DAT = []
9 V- v/ p4 p% Z4 d3 g for row in time:
1 W; I* Z q7 p% _* Z7 N DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
, b* J4 ^! r% @0 ~9 m3 u% x
#create figure
; v4 L3 j0 z6 j
fig, ax =plt.subplots(1)
% n4 d' M& N: Q% R # Plot y1 vs x in blue on the left vertical axis.
; L" ?& I% @2 d5 N4 x: T! O3 c
plt.xlabel("Date [AST]")
% A* W5 I. f6 a( o' K: G plt.ylabel("Temperature [C]", color="b")
0 w6 u e$ v% U: o u4 Y+ U6 V plt.tick_params(axis="y", labelcolor="b")
) q0 c! E K H% h3 z* A plt.plot(DAT, tem, "b-", linewidth=1)
Z m0 m, r5 P/ p5 b6 K
plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
* ]- b& A5 h6 ^+ X, C7 z fig.autofmt_xdate(rotation=50)
8 s: G' m3 D8 Y& P3 Y: M6 Y
# Plot y2 vs x in red on the right vertical axis.
8 z5 e" @6 g) {! p' P plt.twinx()
: F9 w7 @# |) ?9 c7 z2 a5 H9 O. d plt.ylabel("Salinity", color="r")
& {5 N+ E! h, R, n9 N& h4 F# F5 L plt.tick_params(axis="y", labelcolor="r")
% u# V8 ^; M0 X0 [
plt.plot(DAT, sal, "r-", linewidth=1)
9 e# L' K3 T1 P# Q6 T9 B #To save your graph
" |% Y1 }! F/ D& q. `1 ^- L# B. b
plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
9 t3 ?3 x+ \ F" k! f plt.show()
7 ~5 w1 k# O3 U" Y7 a: ~( O! P9 x 
# T! m$ ~' A1 ^( ?3 a7 M
Example 3:拟合曲线(Python)
/ K$ V3 S% F ]$ x9 c
import csv
Z! a U6 a$ D' j import numpy as np
7 v3 R; h+ o7 j3 I1 j import pandas as pd
# l/ S4 ?8 B6 l6 ?* @# i& ]
from datetime import datetime
7 R7 @# m8 S/ S
import matplotlib.pyplot as plt
# G5 r5 {( P. Y2 w" e. f, A4 | import scipy.signal as signal
* {4 H3 H; n8 D
data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
( J, W( n' {7 n) I6 O- ~; b) Q* `: L time=data[date [AST]]
( [5 w+ @3 n) W% A7 X1 N temp=data[temperature [C]]
$ _5 b; H# ~0 c2 s! ~
datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
- N+ Y- y+ R' r1 A
DATE,decday = [],[]
4 p" m: i0 b6 b) _# H for row in time:
$ l. @! W5 E8 i. D7 P7 D daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
1 @0 J7 r( }# ?% g DATE.append(daterow)
/ j* \1 Q" {5 E' z* S5 |4 i decday.append((daterow-datestart).total_seconds()/(3600*24))
5 k' m3 P% H) @" v' T # First, design the Buterworth filter
% x' U3 J; C- T, v N = 2 # Filter order
* W0 k1 b2 a8 t8 D/ E Wn = 0.01 # Cutoff frequency
4 X* t' {( C/ u. O/ ^
B, A = signal.butter(N, Wn, output=ba)
, D0 ~4 A$ w9 ]3 V
# Second, apply the filter
; _1 `8 G* N; W+ { tempf = signal.filtfilt(B,A, temp)
5 ^: \) S" E7 _0 |$ N, k% J # Make plots
0 v- G9 G8 W. _3 y
fig = plt.figure()
}& y" A& K2 C- _
ax1 = fig.add_subplot(211)
) a- O- S4 x; Z, E+ y plt.plot(decday,temp, b-)
' `- h$ A" y$ @3 E2 b; U$ [
plt.plot(decday,tempf, r-,linewidth=2)
' u; A7 e9 h7 r: I' n1 H. E
plt.ylabel("Temperature (oC)")
( |3 J" P, O+ H4 V, O$ p plt.legend([Original,Filtered])
. B7 [( E7 D0 W plt.title("Temperature from LOBO (Halifax, Canada)")
( @# u, D% m& e q6 P1 b4 _. o4 K
ax1.axes.get_xaxis().set_visible(False)
: l. G( ^4 a% U' n
ax1 = fig.add_subplot(212)
, H8 M' J, H3 H, V4 ] b
plt.plot(decday,temp-tempf, b-)
' c9 L& H% D- M% e
plt.ylabel("Temperature (oC)")
4 a' d8 E' S# I( Q) N% g3 u plt.xlabel("Date")
5 P7 ~/ @, |; a; q |4 Y plt.legend([Residuals])
X) w5 U* Y: j$ q5 w/ {! c; f! m
plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
/ X. M* Z# o! P
plt.show()
! P7 K& R d% x* I% }+ u j% `

7 Q" M1 m$ o7 ~ Example 4:三维地形(Python)
' P: z1 ~7 o7 N' r& G # This import registers the 3D projection
) E) k, O$ Z' a+ _6 ^ from mpl_toolkits.mplot3d import Axes3D
# {# b4 D* h# f6 A& [ from matplotlib import cbook
" Y& g: [2 P3 e- F from matplotlib import cm
5 ]; ~ n' |" K' n5 k from matplotlib.colors import LightSource
5 j1 ?: @9 L8 l8 ?3 F! R ? import matplotlib.pyplot as plt
9 K) q; i/ S, K5 k7 A& z; x7 y8 x import numpy as np
4 C. \% H& F; R- q6 C, V( [% i
filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
9 R$ n B0 v- |
with np.load(filename) as dem:
0 D) l3 E0 x6 b2 f6 e# S
z = dem[elevation]
9 W8 J! c2 a7 x! c: X8 M nrows, ncols = z.shape
N: |. I3 F2 \ ? x = np.linspace(dem[xmin], dem[xmax], ncols)
% C* k* s. Y* V n1 o) I5 F6 P y = np.linspace(dem[ymin], dem[ymax], nrows)
3 e9 d4 G) W( w2 x( P* g, V1 ? x, y = np.meshgrid(x, y)
& Y$ |* ]2 r& I/ {0 `! m7 V region = np.s_[5:50, 5:50]
- K; j1 j6 X, j' \& s- ?) C1 C# c x, y, z = x[region], y[region], z[region]
5 F. E( N/ |! x7 s' Q! b! b; D/ m
fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
7 Y0 w8 N" K$ C- m
ls = LightSource(270, 45)
* S$ s. C" Y$ W+ N$ Q, n3 |- ^
rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
; ~3 B0 {) b+ u% j
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
) z) B) b+ c" r( g
linewidth=0, antialiased=False, shade=False)
6 z: M" V0 J. _& }5 g/ \ plt.savefig(example4.png,dpi=600, bbox_inches=tight)
2 Y0 G' w0 A2 H; v( E" L2 z plt.show()
9 q% C8 d8 {: v# H& r6 U/ I7 E8 l5 c
4 a$ O6 V0 E. e6 o
Example 5:三维地形,包含投影(Python)
. F% S$ D0 l P8 c) d _ , o2 v! V$ `6 ]7 x: j
Example 6:切片,多维数据同时展现(Python)
% v4 F6 u/ n0 k7 K% d
% M2 [! J9 w! g u3 S, u Example 7:SSH GIF 动图展现(Matlab)
) r& K* |$ Y. y1 S8 S o7 T/ R$ Q; S8 F
$ r5 V1 U# o6 z- Q
Example 8:Glider GIF 动图展现(Python)
2 [1 l' K; m3 ]. x/ e3 q& b' r
9 ]: a% V/ Z* X A2 R$ ^ Example 9:涡度追踪 GIF 动图展现
2 F5 q7 Y4 O+ n) b: \ ' x0 Y3 k6 A- i- b