' Z( r7 b' E- T* U1 J6 w8 \ 在我们科研、工作中,将数据完美展现出来尤为重要。
( d: e9 |: M- Q, |3 [, e6 d 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
$ E* ?0 _6 b& U
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
; y& Z0 }0 v" A6 p( Z" e) o
Example 1 :散点图、密度图(Python)
' X$ V, v6 @( {8 K2 d8 \) x' x+ S% v import numpy as np
- ]0 {: x& ]) J9 |, n: t* r
import matplotlib.pyplot as plt
, Y8 h! ~. ^3 ^) U
# 创建随机数
* ?1 B X) A& U" [" P
n = 100000
2 G/ O% F7 W9 z6 a" }5 | }
x = np.random.randn(n)
, W) i' L8 u4 T% M) _6 Q( H
y = (1.5 * x) + np.random.randn(n)
7 s. b4 y% b0 I$ v; T9 v fig1 = plt.figure()
( w7 `! N5 M& f. J& A plt.plot(x,y,.r)
3 t5 h5 l t* V$ v n7 B
plt.xlabel(x)
0 W2 M* Y, m: A1 V7 D8 t
plt.ylabel(y)
3 d, ]. ^1 G+ O- ~1 p$ U
plt.savefig(2D_1V1.png,dpi=600)
3 h2 B& H* d9 S7 \5 S nbins = 200
4 p+ z. c7 b: o0 N2 [3 e
H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
: K5 S& F1 P; c! \ # H needs to be rotated and flipped
' J9 g, C0 j/ B1 U. z& a( n! x2 H1 e0 B
H = np.rot90(H)
9 A& C1 D& z/ q8 F" |& _
H = np.flipud(H)
e& H2 W& ^$ k3 k4 ~$ b # 将zeros mask
* e/ R* @8 p- M1 p- N3 ~
Hmasked = np.ma.masked_where(H==0,H)
% W5 W7 A$ }4 m* G& r+ D6 }% l8 N m& r# y
# Plot 2D histogram using pcolor
/ \# T+ h# O, x/ C fig2 = plt.figure()
. C0 g5 W4 b$ I
plt.pcolormesh(xedges,yedges,Hmasked)
1 j# p4 A1 M. [
plt.xlabel(x)
m8 M. f0 d1 `! S plt.ylabel(y)
' C0 C, ]( P: W+ B
cbar = plt.colorbar()
7 v( M+ x8 `+ U8 K, ~' Q2 B cbar.ax.set_ylabel(Counts)
* m0 K0 Y' [* h4 e, g plt.savefig(2D_2V1.png,dpi=600)
$ d$ j9 X( [9 I6 G
plt.show()
, X& }' a8 T0 L8 j% O! i: i6 }
* w. e' e- n6 }/ g! g& ` % y5 O) O+ k- u8 \
打开凤凰新闻,查看更多高清图片
( o% {( i$ V$ \) e. U
2 ^ P8 I: R, f+ U1 B, e; p
* `$ q& E# T9 K) A) G5 f' j! v 
2 d) w/ M- I7 P+ {: `3 y
Example 2 :双Y轴(Python)
9 e& t/ a2 {" [& {; _
import csv
; A* j( F$ G1 K
import pandas as pd
9 p j) Y3 F. @8 [/ J/ f; d import matplotlib.pyplot as plt
+ `( w! j+ h6 f, P- C! S from datetime import datetime
% l* H' Z5 \" o" |5 f
data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
?( P/ x5 i l, y( s/ _ Q; N
time=data[date [AST]]
. k8 M) y6 |% _' S F0 [* ? sal=data[salinity]
2 A8 Y8 e: D; ^9 a- z9 A2 E! Z2 {
tem=data[temperature [C]]
8 r$ k& t ]. e* S T
print(sal)
) t- i& X! u( `, n7 \6 D: d
DAT = []
# ?! D m/ @" v, @8 X( P for row in time:
" c- A* S" n- f. ] DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
0 ?' ^6 T: I6 K* F$ V7 M
#create figure
* V. g A; ^- ~3 H; `8 Q5 b4 n* [ fig, ax =plt.subplots(1)
5 k( p( A! c; m4 O # Plot y1 vs x in blue on the left vertical axis.
* b7 f" @+ T: L- C4 U0 V; n3 z
plt.xlabel("Date [AST]")
2 K3 t5 z2 t' P' ^1 c: ]. Z6 b
plt.ylabel("Temperature [C]", color="b")
0 \2 o- r! J4 R plt.tick_params(axis="y", labelcolor="b")
- |' b! a0 A% K2 M7 ` plt.plot(DAT, tem, "b-", linewidth=1)
# _, U9 o7 H" b* D, L; v }9 t+ L" m
plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
: ]. u, J1 d+ w! s5 X fig.autofmt_xdate(rotation=50)
' w; g! C: T. R
# Plot y2 vs x in red on the right vertical axis.
; h: |7 E; h* k( { plt.twinx()
1 {& {3 t2 v9 } plt.ylabel("Salinity", color="r")
: h1 l6 T1 C! S
plt.tick_params(axis="y", labelcolor="r")
, r+ k* r& ~, n) D* L( U% ~ plt.plot(DAT, sal, "r-", linewidth=1)
- J4 a5 o# L7 ]( a. Y
#To save your graph
" {" ]( J |1 f! J* @ plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
, {( O- h/ P1 I; n# @
plt.show()
8 Z( x" w: I2 Y9 w 
' t4 P% b. d Y0 a+ T- p7 V! T' o Example 3:拟合曲线(Python)
, W9 t9 Y1 K! d8 h8 r7 t import csv
- _0 v" [4 f) f8 A
import numpy as np
3 b2 Y1 e) E9 e* e& m$ a import pandas as pd
) D" B) X9 o2 s: j1 Y7 b from datetime import datetime
G) q' R; W$ q5 z8 M. H
import matplotlib.pyplot as plt
( h2 f6 s1 d7 C, A K( x
import scipy.signal as signal
0 _; |; q5 z1 I$ X
data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
" ]3 Z- Z* q& O9 Q5 Y. H
time=data[date [AST]]
. u; y" j) p" T5 i& W temp=data[temperature [C]]
* W6 n' C6 O' ] `* Q5 n/ y datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
# ?, W8 ]& M. L/ v/ E9 l& a0 ?- B DATE,decday = [],[]
" E% ~5 e2 D/ R7 |; H- e" c for row in time:
) W. n, P1 Z5 {' c
daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
. ^/ Y9 y% P; \+ V; } DATE.append(daterow)
3 Q9 q2 d3 q* I decday.append((daterow-datestart).total_seconds()/(3600*24))
0 h% H/ h. x( j. W3 H- T. e! {3 |8 c # First, design the Buterworth filter
, ]( D. C+ t- I6 g1 r N = 2 # Filter order
# n/ |1 |/ {) N0 u' i Wn = 0.01 # Cutoff frequency
; g) a: K s' Z% y
B, A = signal.butter(N, Wn, output=ba)
: E7 L5 B2 t6 o' P$ N$ C' l/ s
# Second, apply the filter
3 J2 Y6 i, [1 L& p$ d P; P tempf = signal.filtfilt(B,A, temp)
4 C" \( Q- d- N( j W' `& I # Make plots
E J, J( [9 A4 C% q
fig = plt.figure()
4 K6 @; b4 { g2 m: R7 \ ax1 = fig.add_subplot(211)
, r+ C2 z* H+ ^( m2 m# q
plt.plot(decday,temp, b-)
3 L" z4 [+ c6 `, F plt.plot(decday,tempf, r-,linewidth=2)
) h' ]1 J' [" R; N
plt.ylabel("Temperature (oC)")
' ]: b6 W% k+ V; k* q8 a b plt.legend([Original,Filtered])
1 ?( x4 {- T* m2 Q plt.title("Temperature from LOBO (Halifax, Canada)")
8 {0 x+ I! c+ N! D& I2 d6 A' t ax1.axes.get_xaxis().set_visible(False)
6 ~0 J+ i8 \7 S' F. `8 i, i4 `( E
ax1 = fig.add_subplot(212)
( c: F' v& K; m" p
plt.plot(decday,temp-tempf, b-)
! P. `' q g B$ V plt.ylabel("Temperature (oC)")
& V0 N5 d/ k" M
plt.xlabel("Date")
/ y0 i+ w3 G8 f8 m. N; i8 o: j: n plt.legend([Residuals])
" G, S7 x" t/ S plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
, ~8 p/ }8 i# K4 U. C8 @# M
plt.show()
$ D8 Q/ _/ `/ x$ a1 y

; d! v$ j4 i0 s0 X) L. Q. i6 d/ k
Example 4:三维地形(Python)
: M" J2 I- I- ~# \
# This import registers the 3D projection
9 l# F' s2 g7 b: L1 k9 t/ v from mpl_toolkits.mplot3d import Axes3D
+ u( ? g5 ^2 g0 C- ?2 T" R from matplotlib import cbook
, S3 r: b. A0 O from matplotlib import cm
/ E Z! Z* o8 E from matplotlib.colors import LightSource
! F8 {5 |+ C( X- q' Y import matplotlib.pyplot as plt
- o$ M: f2 j& X5 g$ T4 t
import numpy as np
* b7 w6 N' {5 H* T& Q; k
filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
9 ^2 b" [3 i- ?2 e, f with np.load(filename) as dem:
" d/ Y: m' x3 y z = dem[elevation]
R8 H! l. T9 S4 |+ i) z nrows, ncols = z.shape
, x( l: \- O" c/ K$ }% Q9 \" } x = np.linspace(dem[xmin], dem[xmax], ncols)
6 [$ E( d4 q' R5 l8 o# h9 |7 ] y = np.linspace(dem[ymin], dem[ymax], nrows)
3 F2 ]5 D g/ k1 R+ I1 M
x, y = np.meshgrid(x, y)
, t5 v N2 f u9 z% |/ {
region = np.s_[5:50, 5:50]
" r: } b3 i+ l% z' \3 P7 r x, y, z = x[region], y[region], z[region]
. P Y' f4 b: p! s) X, i
fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
! g ], E1 U( X ls = LightSource(270, 45)
% G) q+ D, r% J" P2 ~) E rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
" m4 L( `% D: B6 B* J+ | surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
3 ~' l! n, [0 A* c' d linewidth=0, antialiased=False, shade=False)
5 c9 D3 T1 A! D" w" l9 ]
plt.savefig(example4.png,dpi=600, bbox_inches=tight)
( b" k8 C6 k2 k plt.show()
& k* t" {9 n& U$ ?
% O9 g* p. ^8 k6 U" u3 I0 H: i Example 5:三维地形,包含投影(Python)
2 e1 T* O/ ?, B3 l1 ~/ j ! [8 P: B( P/ d4 m( J6 X6 |
Example 6:切片,多维数据同时展现(Python)
9 w0 x$ Q: K1 B0 X
# c1 ]: b( T" \2 D' \7 h+ H Example 7:SSH GIF 动图展现(Matlab)
8 n* e L' h7 s8 V
" B4 ]! H$ F9 x& p, \* N Example 8:Glider GIF 动图展现(Python)
4 H) P# G1 K0 e1 `. a. V
: u7 X6 G* ^3 L6 b; ^0 K! v
Example 9:涡度追踪 GIF 动图展现
: e3 }, w$ O O0 g; C& A: B) U- Q# p
4 r8 c; [! X8 ^% h# \( G$ F& c