3 d5 f9 R: h7 _/ |0 c9 l0 r 在我们科研、工作中,将数据完美展现出来尤为重要。
& L' R; [6 r* z$ l 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
6 L+ v* U$ q* ]
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
4 [% [, n" A9 {+ F8 i Example 1 :散点图、密度图(Python)
W/ [$ ~6 w' Y' ` import numpy as np
K% O8 Y- p1 A0 k4 H& H import matplotlib.pyplot as plt
5 s- w( G: H# e4 v. `' D4 X # 创建随机数
6 o: W: j7 [1 D) I4 O0 ?7 F n = 100000
6 H+ i1 [) M, s: V1 \3 N/ X
x = np.random.randn(n)
- z' D7 U1 R, {: B y = (1.5 * x) + np.random.randn(n)
9 Z$ Z, }0 g! G; E fig1 = plt.figure()
! j& {) a5 F% h# r plt.plot(x,y,.r)
$ y" Q* x7 u) c) h, ~2 O1 G
plt.xlabel(x)
* a6 A8 u' d/ p: }' k3 e( g plt.ylabel(y)
' `, D. x: b5 Q. m" X
plt.savefig(2D_1V1.png,dpi=600)
* ]5 ~5 z1 `" ]9 g* ^ nbins = 200
! y' D! D+ o' |% O5 o; }2 B H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
5 Z* _' l$ J7 A% J$ \ # H needs to be rotated and flipped
; ]- y7 ^! ]6 p( S8 D1 y* _
H = np.rot90(H)
( X# r" O0 `( ~6 I, a; _ H = np.flipud(H)
: \, }5 ` ]) E" U: Q. L& \. k
# 将zeros mask
7 A# j: W# c1 h: y
Hmasked = np.ma.masked_where(H==0,H)
) v/ J9 a! i( l6 e) Y0 ?/ @ # Plot 2D histogram using pcolor
* h# f' E4 t: c- q# v- ? fig2 = plt.figure()
9 E$ G+ ]$ i0 k J plt.pcolormesh(xedges,yedges,Hmasked)
: [+ l$ k/ C7 Y/ a* P* k: F
plt.xlabel(x)
% A* d! y+ m) G+ P" @" ? plt.ylabel(y)
3 Z8 Y4 K/ @9 y
cbar = plt.colorbar()
4 D+ |* j1 z d2 o$ E1 p
cbar.ax.set_ylabel(Counts)
8 J+ v' D8 C; q0 b
plt.savefig(2D_2V1.png,dpi=600)
3 k6 L3 `: q2 s plt.show()
/ G/ T% h+ [. w$ \1 T, N8 o
1 `- t$ V3 ~9 }9 x- W% f
/ Y. R9 x8 f) G; C6 b J4 C! d6 H
打开凤凰新闻,查看更多高清图片
8 }+ U3 ]; r* ^ q+ A3 d2 e% G9 W' r. | F
! F; f% C8 p7 v; x& C3 Y0 {7 q

. g& i3 R3 `. Q4 s3 w
Example 2 :双Y轴(Python)
N3 U9 J+ Q, l) i
import csv
+ ^8 v" H0 L" W5 E: ` import pandas as pd
5 b5 [' s& D+ i N! J( c
import matplotlib.pyplot as plt
$ j$ k! Y S& L, w8 U
from datetime import datetime
( a2 ?, @; R0 b& m# j$ c' w& x data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
$ ~1 A- L$ P" O0 E2 X+ e
time=data[date [AST]]
) A6 r9 g$ A2 @ sal=data[salinity]
* u( h5 N. m9 c/ V. ]9 b, ]2 g tem=data[temperature [C]]
; v, J! y/ m3 c$ R3 g$ \7 o3 ?/ b print(sal)
6 h# {! ]2 {5 B9 D; m; k; W
DAT = []
/ g( |0 G. t: ^5 t4 J( m' J
for row in time:
; ^3 U1 s& h4 j( H DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
: S1 j- S0 S( M" u$ a3 }0 c% Q- `
#create figure
2 m0 k' B+ p# K3 i6 {$ `
fig, ax =plt.subplots(1)
+ t; Q4 H# R% o" j& U( M # Plot y1 vs x in blue on the left vertical axis.
/ S* h" w6 R; y- s7 S$ d
plt.xlabel("Date [AST]")
* C( g# b Y z, l) j7 o; o plt.ylabel("Temperature [C]", color="b")
' l" A( r6 ?" C; d4 E plt.tick_params(axis="y", labelcolor="b")
- D/ X* N$ P- g6 v plt.plot(DAT, tem, "b-", linewidth=1)
: t$ T& l, Z7 b' L$ [, a plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
) ^' r( y/ L+ e0 P
fig.autofmt_xdate(rotation=50)
! D/ ^# E. P5 z# [ # Plot y2 vs x in red on the right vertical axis.
! ?$ V* ]: Q. B$ {( b# e$ n E9 q' L
plt.twinx()
& |) K: V* f+ c% |, F. f' z s
plt.ylabel("Salinity", color="r")
6 J+ m) w- w7 o' g( c6 o plt.tick_params(axis="y", labelcolor="r")
2 @. p7 k3 j! l' m# Z2 G( |6 @6 g$ b plt.plot(DAT, sal, "r-", linewidth=1)
s Z- w( L: x
#To save your graph
$ P7 p( i. L% A0 C+ w3 N9 L$ w
plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
0 z4 ]( {4 ^1 ~9 T
plt.show()
# e" L" ~1 `$ Z9 n& ?- Y8 u

' s2 s7 q, W3 C$ R5 X1 M
Example 3:拟合曲线(Python)
- e6 _1 |4 _+ w, D import csv
) d6 H( O5 ?" a! v
import numpy as np
# {; q: S( C' A7 W W import pandas as pd
! ?5 N: y- j1 B c& K: ~8 c& T. u0 c
from datetime import datetime
i4 z# V$ G0 m! G6 O& Y import matplotlib.pyplot as plt
% X! R+ H6 t o. s
import scipy.signal as signal
1 M5 ]( S, P: Y0 q) j$ J
data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
% R# C- H% v% q time=data[date [AST]]
; ^+ O/ e* ]4 A/ [9 x! E# Z
temp=data[temperature [C]]
0 v g0 n) `+ B+ ^. M* ^2 o& K
datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
' R2 a' A+ ^* r
DATE,decday = [],[]
0 d- L, j8 X! c4 B$ U) h0 D8 Z for row in time:
8 f4 c# r! \# T" W7 s# X3 R2 R daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
8 u' H. Y" w$ K" V+ D. n( ~
DATE.append(daterow)
$ E2 W Q R' T/ {8 J3 M s1 t
decday.append((daterow-datestart).total_seconds()/(3600*24))
2 c! q: f4 H* x # First, design the Buterworth filter
) S! v [' `. U1 i% W
N = 2 # Filter order
* s' T6 w, |, u- X8 q6 W) A/ U Wn = 0.01 # Cutoff frequency
3 r1 h6 ^+ U3 t7 J5 t
B, A = signal.butter(N, Wn, output=ba)
+ L0 H( D7 S4 q' p2 K9 P [
# Second, apply the filter
& S! }0 Y2 ?: K8 X. B( Z# d tempf = signal.filtfilt(B,A, temp)
! {' G& D9 i( Z
# Make plots
, c3 l: z4 w O# f/ ~1 B fig = plt.figure()
3 N Y5 M/ i7 d9 |3 e( e- A ax1 = fig.add_subplot(211)
# J- d+ {* @" X
plt.plot(decday,temp, b-)
% f( h+ T1 Z$ x3 ^
plt.plot(decday,tempf, r-,linewidth=2)
0 l; V6 o; |9 i; v) N/ c
plt.ylabel("Temperature (oC)")
3 z: a( r F2 W
plt.legend([Original,Filtered])
' U6 H+ i/ K0 Q+ B) o+ u$ I. Q plt.title("Temperature from LOBO (Halifax, Canada)")
# D9 X! _1 w* |( p4 h& s( i8 k
ax1.axes.get_xaxis().set_visible(False)
8 G% a: s4 w/ D) U/ ]! s' P' K
ax1 = fig.add_subplot(212)
1 G, m- W4 ]8 P o
plt.plot(decday,temp-tempf, b-)
6 T5 _$ x* a1 u plt.ylabel("Temperature (oC)")
# C" G8 @" t6 u; x plt.xlabel("Date")
! d w* N# [' k. ?- u plt.legend([Residuals])
8 a6 ^' ]' L% j' b& t6 b plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
4 r! B' Z% H( I' X/ A0 q: B) c plt.show()
/ g9 _) |8 d1 O. C 
! U0 n' E3 P- k' \# Q
Example 4:三维地形(Python)
6 w3 l: U7 U. q # This import registers the 3D projection
8 d: Z" q6 y1 K5 H' Z
from mpl_toolkits.mplot3d import Axes3D
* a. k8 L0 C; F. W, o) b4 Z from matplotlib import cbook
$ K" b% ~7 p1 V. K; k- F
from matplotlib import cm
! t4 i6 t0 J: w y7 n8 E* A$ }
from matplotlib.colors import LightSource
/ s5 z2 u b+ m/ S2 ?/ j7 p import matplotlib.pyplot as plt
- P& [0 [* ^. G& [' U& x. c
import numpy as np
# G* c0 }4 g$ L% P: I6 X filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
+ A5 Y( u0 `4 ] with np.load(filename) as dem:
7 b$ U7 n9 S+ S z = dem[elevation]
4 E9 L( A6 u9 i- m- l
nrows, ncols = z.shape
) u1 D2 f% K$ N: U5 B
x = np.linspace(dem[xmin], dem[xmax], ncols)
0 x# i: Y& v+ ~- z. y% D y = np.linspace(dem[ymin], dem[ymax], nrows)
' c, B& x3 j e
x, y = np.meshgrid(x, y)
( h7 X- u8 \4 R6 Q, o6 a region = np.s_[5:50, 5:50]
, F; j) g; j3 Z- ?! l x, y, z = x[region], y[region], z[region]
" P8 \: ?. `2 q$ P2 { fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
5 [/ f8 X; j$ o& b# O- r; n3 o' D
ls = LightSource(270, 45)
% q. i! @+ N+ T% e. N
rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
) y: E9 F+ E! z E- v
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
) n1 r# }+ g" E, W8 H9 N linewidth=0, antialiased=False, shade=False)
8 e V% x' t; v# ` plt.savefig(example4.png,dpi=600, bbox_inches=tight)
3 v* T9 T5 B& I' A3 z5 a) L4 k
plt.show()
9 V5 ^: A# V3 p" `, n3 g" b2 Z0 n
) ^: A! x" g; X' z Example 5:三维地形,包含投影(Python)
& l: K, U! N% v# |- P
2 q7 p* i7 `( }7 @% c' s* R Example 6:切片,多维数据同时展现(Python)
1 _# u/ V. o/ N5 ^) _) A, A
6 {1 {1 J! Q, i
Example 7:SSH GIF 动图展现(Matlab)
w9 ~, v/ q) B& i# T + L$ M# P: h/ u6 Z% K M
Example 8:Glider GIF 动图展现(Python)
# B. c' ]# n# a' q: ?, l
8 |: ?6 [6 W0 F& K% y7 n2 Z Example 9:涡度追踪 GIF 动图展现
* J4 i* {! W' c# m3 @3 L( t * h; ]7 i: [- I