& z* U1 M+ D. r" @8 F 在我们科研、工作中,将数据完美展现出来尤为重要。
+ L0 \# ^, x0 Q M5 Z
数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
/ h8 v* v' B' l" s" X; r+ I. o
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
. a6 _; ?- l+ D$ Z' f0 _ Example 1 :散点图、密度图(Python)
. u$ T( X9 {- V; _% T
import numpy as np
3 ]' C- [1 `* B! H* t
import matplotlib.pyplot as plt
& w6 V& n% k2 C # 创建随机数
/ c. X, G C$ y n = 100000
* j6 Z5 k" a7 Y; C3 ]* b+ W
x = np.random.randn(n)
2 U& B, L6 c/ m+ k/ N3 o
y = (1.5 * x) + np.random.randn(n)
* D: r! i9 P/ y& U0 d: z fig1 = plt.figure()
- g& Y4 t6 Y9 z$ y$ J" W7 W plt.plot(x,y,.r)
/ z0 M# i& _6 M; z { p. A$ Z! R
plt.xlabel(x)
; Q/ h$ M1 ]# H
plt.ylabel(y)
/ I% c+ W+ z" F$ [
plt.savefig(2D_1V1.png,dpi=600)
. m1 |/ j# {1 w$ c6 S4 H/ T
nbins = 200
h$ ^# {3 E8 Z1 e
H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
9 \8 N t& C3 r3 q+ `$ a # H needs to be rotated and flipped
; t: e$ o/ q1 T) C, x H = np.rot90(H)
) \0 d" ~5 N4 T4 x H = np.flipud(H)
! V1 g. b' @: k6 \( ` # 将zeros mask
! `8 b. k0 U* k U% d" u8 t
Hmasked = np.ma.masked_where(H==0,H)
' X$ p8 g2 H0 x* ]+ ~ # Plot 2D histogram using pcolor
+ X9 H- |4 [4 m fig2 = plt.figure()
) W3 P& K, @- w* X: Z4 ^+ Z) S: o plt.pcolormesh(xedges,yedges,Hmasked)
3 e! {+ L& z# L/ n
plt.xlabel(x)
5 P' }' I4 z( r+ `
plt.ylabel(y)
: a2 d6 V" q3 s
cbar = plt.colorbar()
0 q" V: N q% K* S+ [# ~ cbar.ax.set_ylabel(Counts)
$ k ?4 H( [0 b+ q: k# p plt.savefig(2D_2V1.png,dpi=600)
& ~' J3 i. n+ x2 u4 {' B+ V plt.show()
6 L- P% G @/ K5 p% a
* T2 p5 T( ^, Z& Q! G8 p* S: t
6 N& w5 T7 ~+ e) k
打开凤凰新闻,查看更多高清图片
& P/ C; n1 p! | T- X
) w% ~8 R8 `/ S
( P" Y1 |& V3 o7 z2 E 
( g* v, j3 T; A6 J4 r1 d2 L Example 2 :双Y轴(Python)
. E- I( d1 I2 c6 ^2 T
import csv
/ w, C! M- z/ i8 z import pandas as pd
4 y8 A5 M9 r' b4 X9 V import matplotlib.pyplot as plt
3 z/ \; r, D2 A7 x! i. ?
from datetime import datetime
7 n' k' V: N: u& { R
data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
4 ~ M' v) A% n# q time=data[date [AST]]
! I, q+ S3 I. w- u
sal=data[salinity]
9 l/ \3 ^ f/ z. c tem=data[temperature [C]]
% f& I) U/ V7 S" H/ k3 d1 Q
print(sal)
: e# T$ I0 l: T4 ?% m, b( } DAT = []
0 f# P. r+ g2 \" a# x5 w for row in time:
4 C8 Z, m; ]% `4 s) `! b! f+ ~$ u
DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
3 k% o! a0 F& P' d. t3 s #create figure
& u) T/ v, ]: u9 F' s
fig, ax =plt.subplots(1)
% u) L' P7 ?/ S& P6 o9 ] B # Plot y1 vs x in blue on the left vertical axis.
5 [/ c) f: R5 s/ Z9 f plt.xlabel("Date [AST]")
5 o2 R4 H6 K2 ^7 ^) m
plt.ylabel("Temperature [C]", color="b")
/ q- }9 l) p u5 s7 d% s2 b, V
plt.tick_params(axis="y", labelcolor="b")
" L% x" m( J4 a) _0 g; i plt.plot(DAT, tem, "b-", linewidth=1)
1 N8 \( ~6 B; c$ _) H8 i
plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
* C% ~. }! z+ ^# ~
fig.autofmt_xdate(rotation=50)
; l1 Y0 v, N6 ? # Plot y2 vs x in red on the right vertical axis.
$ S+ H! ~7 Y: K& i6 ]
plt.twinx()
4 `" g$ G$ F3 b: S7 Y
plt.ylabel("Salinity", color="r")
% R9 p0 x0 h$ \. M- j. {* P
plt.tick_params(axis="y", labelcolor="r")
+ n5 h) }+ }5 O8 x6 G5 a
plt.plot(DAT, sal, "r-", linewidth=1)
9 P' F/ e3 P- l N) J
#To save your graph
4 k* I1 t( w$ I7 K- C: T* p2 E plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
& k+ G3 ~ y! o+ f: o/ c
plt.show()
% ^% V! y* t% D

0 z3 R' U `& s5 H& _) {& p Example 3:拟合曲线(Python)
6 f/ g5 _. S; S+ t% E
import csv
7 U+ L# K b9 }4 m" O# b/ B import numpy as np
7 f# e$ Y% j- b4 S9 N% I. J" L
import pandas as pd
7 z8 E( j* B4 @1 G- p
from datetime import datetime
( t' |7 |& Q' H0 n' X import matplotlib.pyplot as plt
2 o0 @. C) Q% Q2 z n' w
import scipy.signal as signal
) } e* T( d- G/ m. k& f, D
data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
$ H4 z: i7 N( l0 K g time=data[date [AST]]
& R* _" l& A( P0 h4 }. `9 j: z) w
temp=data[temperature [C]]
* u% j7 ^6 Z5 n$ f& m( M* y) B" X
datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
# l. Z+ ]) S: F" |+ W; a* U
DATE,decday = [],[]
+ E1 y% {/ w* \7 a6 V: I2 V
for row in time:
5 \8 d: c) Z! R1 ~ f daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
# W5 |( b* p/ e5 ]2 Z; m! q$ R
DATE.append(daterow)
, A A$ k$ s: L
decday.append((daterow-datestart).total_seconds()/(3600*24))
. D9 N7 G9 R' X `4 Q- o/ P. f: m3 y # First, design the Buterworth filter
G7 ~' ]0 `- P: ~! M& d! O4 ~
N = 2 # Filter order
: a X5 V5 I) L Wn = 0.01 # Cutoff frequency
4 W, f2 T# B U1 P2 c( R. \
B, A = signal.butter(N, Wn, output=ba)
f4 ^% o- g! \! C # Second, apply the filter
' b9 K( r) T: E$ Q tempf = signal.filtfilt(B,A, temp)
8 p& v3 B1 S. A: f" }
# Make plots
, t G$ k8 e g% A
fig = plt.figure()
/ u3 n* l, m* k: j" L
ax1 = fig.add_subplot(211)
. t4 O% e" o9 k* {! i6 Q! n
plt.plot(decday,temp, b-)
# k! T$ W }2 `9 y/ R( {- w plt.plot(decday,tempf, r-,linewidth=2)
8 G4 O- X) f" ~* |1 x/ | plt.ylabel("Temperature (oC)")
) a J' ?- b9 N plt.legend([Original,Filtered])
( Q u& e- _- Y: k# @& ?1 }2 U
plt.title("Temperature from LOBO (Halifax, Canada)")
2 X: }1 E7 i; D7 d% e) T ax1.axes.get_xaxis().set_visible(False)
! W& k0 U M- X8 P( i4 i! K
ax1 = fig.add_subplot(212)
( U! c! N+ m0 u plt.plot(decday,temp-tempf, b-)
, G7 r6 h" t [2 X' E plt.ylabel("Temperature (oC)")
7 g: J# m0 ?8 Y ~& ^3 {
plt.xlabel("Date")
# P5 ?! s4 p- r: p1 h' I0 d
plt.legend([Residuals])
/ C ~4 b5 _5 ]& N
plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
% S. Q5 N. m& c& r/ x, g& _ plt.show()
' a! v6 @" N6 n" u3 t2 O$ h }

# x! M) O: o* x+ Z. s% i
Example 4:三维地形(Python)
$ q' K1 n: x1 ~( }
# This import registers the 3D projection
4 Q, T( }) q1 e: `. |) [6 C
from mpl_toolkits.mplot3d import Axes3D
) `% p9 P* ?$ E! Z
from matplotlib import cbook
1 S4 I7 l' U7 Z) ~& |* N, x
from matplotlib import cm
: Z, k1 @* [. M2 y/ n5 u from matplotlib.colors import LightSource
3 G* X9 u- j( R8 n import matplotlib.pyplot as plt
7 J0 D% t ^4 g1 F w2 Q; e import numpy as np
$ C0 T! y) Z% f* v# E filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
/ p) G2 ?6 B8 s, b/ T6 e! i! X with np.load(filename) as dem:
, Q5 z! A& h7 @: Y5 `, d z = dem[elevation]
: o s1 V) y, H# j& _ nrows, ncols = z.shape
/ u4 m# V3 r) Y! }' j x = np.linspace(dem[xmin], dem[xmax], ncols)
& M% l ~' [# }& }+ H
y = np.linspace(dem[ymin], dem[ymax], nrows)
/ b! [( x' h- i% Z$ u2 j x, y = np.meshgrid(x, y)
. I% F+ ^- c8 U4 _9 y! J, M region = np.s_[5:50, 5:50]
" c# r7 X1 e2 f) C6 c6 r* v x, y, z = x[region], y[region], z[region]
4 J- p8 f& Z* b fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
8 X4 |% `! ^6 ?/ ? ls = LightSource(270, 45)
+ s6 \' Z& ? }
rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
# {- B: a, L) \ surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
+ S: V: w6 a* R
linewidth=0, antialiased=False, shade=False)
: c7 c" \3 U2 Z. X1 r6 v+ ^0 l6 s0 J
plt.savefig(example4.png,dpi=600, bbox_inches=tight)
2 T1 p G% B5 q/ Q4 r$ h' Y$ k4 p
plt.show()
2 a" d5 K! v" s! `" {/ {5 m S ! p6 N3 K( e1 r* ~
Example 5:三维地形,包含投影(Python)
- R% C# m; h. F* ^5 w: |1 u+ N& x ! ]! ?- u' h* K2 K9 d# e# ^
Example 6:切片,多维数据同时展现(Python)
2 N; o1 u# n7 |, ?6 h: ?' Q
, m( v, n6 b6 U$ W+ V( Z
Example 7:SSH GIF 动图展现(Matlab)
- E$ `( r r- } " `! x% r4 `+ L2 O& x& S7 J
Example 8:Glider GIF 动图展现(Python)
7 O- v4 R- w9 h2 o$ z
. x& I( \3 m- ?$ c( D
Example 9:涡度追踪 GIF 动图展现
7 S/ O* f& s+ ^+ E
) L V4 d7 U2 O% P, k