8 t4 p. W. z$ { 在我们科研、工作中,将数据完美展现出来尤为重要。
# |( [+ P9 h8 x* O0 w 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
" E$ z$ k& [4 w4 g 下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
# N1 w- B4 z& k+ K% Q
Example 1 :散点图、密度图(Python)
1 ?2 @" E$ T# Z) L, G7 q# q( ` import numpy as np
0 Q( v* n: d: I+ X import matplotlib.pyplot as plt
: X2 ]0 [8 O2 Z/ [% q* I3 | # 创建随机数
5 h. U6 u& k! ~# a5 k9 e9 ? n = 100000
1 v+ |& ]. ]6 E5 V ?
x = np.random.randn(n)
0 D9 x, H( ~- ^0 q) f y = (1.5 * x) + np.random.randn(n)
& L# R+ a6 ~ L7 Q+ A fig1 = plt.figure()
; \2 @2 g) L6 e% _' T4 f5 ?* Y% ]& P
plt.plot(x,y,.r)
7 z2 j9 Z7 E& J6 {, G/ c1 m8 y { plt.xlabel(x)
2 Q, p) m5 x; V' F1 o: Q
plt.ylabel(y)
8 }$ h5 ~% S0 T% z. a plt.savefig(2D_1V1.png,dpi=600)
$ y; W/ M% S: Q4 P nbins = 200
, z7 ?4 W3 ^" `$ ]0 e. r* f; X+ G
H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
- _' v: }% H# M' T; v$ U9 I a+ d # H needs to be rotated and flipped
0 K* p' @8 _3 d% ] H = np.rot90(H)
& F4 X! k8 b' f: r7 W/ q H = np.flipud(H)
, _3 b* j8 c, k( x; s
# 将zeros mask
: P% p) h; |4 z$ a. ~ Hmasked = np.ma.masked_where(H==0,H)
7 m3 x' k2 V6 e( X # Plot 2D histogram using pcolor
. q7 D# g( f6 f" Q& Z fig2 = plt.figure()
5 b; o8 f0 D+ y4 b& u9 a( C6 h
plt.pcolormesh(xedges,yedges,Hmasked)
& B! L' N! H5 i+ ~3 K
plt.xlabel(x)
- [+ T* L* O! ?" w& f9 l plt.ylabel(y)
0 g3 G# j1 ~: J0 r9 i* g0 B5 T cbar = plt.colorbar()
) q- n% e! j: S% R1 q" e cbar.ax.set_ylabel(Counts)
3 y- D+ v L1 O5 J9 C- G, _
plt.savefig(2D_2V1.png,dpi=600)
0 l6 t" e0 E0 b" e9 k+ C plt.show()
- t& s7 i) R8 ~! @
" j9 g+ k9 ~: \% X
0 z) [+ `3 \8 \4 R5 P7 B
打开凤凰新闻,查看更多高清图片
2 {1 w& `, e( S! V0 Y ' Q9 m. L) v4 ~- H" m* F
0 n$ b8 N8 w T2 P, h" a9 m! L" _8 @

* p: u2 [# U' S% M9 Y Example 2 :双Y轴(Python)
) f S Q) C" o: i! l import csv
7 |7 n1 x6 T$ t3 q import pandas as pd
( z# P+ E3 C c% X u7 @3 z import matplotlib.pyplot as plt
0 L2 g) B6 g. J from datetime import datetime
5 S1 c) l2 p3 N" ?3 [. |. z5 t6 E data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
+ Y' j8 H. F7 i' ~3 r) E time=data[date [AST]]
& F( `8 D. _+ L% i; ]1 L
sal=data[salinity]
' ^7 h. W& N6 J6 C" H
tem=data[temperature [C]]
# i* o9 ?, w( d7 l0 l print(sal)
) y+ t0 L2 t& X
DAT = []
$ m$ J" X# G/ G, G+ b0 t9 S for row in time:
; X) a* W% l5 @ DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
; ]1 y8 u: N* k( m #create figure
" Q; M5 o3 q; X& g0 N8 X
fig, ax =plt.subplots(1)
5 i) S* N% G% y3 E
# Plot y1 vs x in blue on the left vertical axis.
$ _( I! x$ @5 @- f plt.xlabel("Date [AST]")
9 ~; p& d1 x: \4 T: k K plt.ylabel("Temperature [C]", color="b")
, L0 z! ?' ^5 v) h' f/ @ plt.tick_params(axis="y", labelcolor="b")
2 [5 k/ C6 E l/ t I6 N! h plt.plot(DAT, tem, "b-", linewidth=1)
' I: f* L! F6 A& `$ A
plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
; }' H; G3 m* R6 l' u$ `
fig.autofmt_xdate(rotation=50)
9 B M8 z l' L6 d, E* Q& _
# Plot y2 vs x in red on the right vertical axis.
4 S& S! K4 v8 G* @! t( V plt.twinx()
: x/ y1 O' B: J4 M
plt.ylabel("Salinity", color="r")
B- k) Y# G e U8 p8 { plt.tick_params(axis="y", labelcolor="r")
- t- F# q* G5 v. W1 U4 }% r" s3 t3 r
plt.plot(DAT, sal, "r-", linewidth=1)
8 u0 ?/ V' [/ C* L+ S+ X, M: K S #To save your graph
* k' j1 o# S2 z4 k6 v1 h
plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
/ k. _7 _3 X0 d1 o$ h
plt.show()
) h* ^2 X& d9 F" W6 z. S; [* n 
* Q; Q3 ?8 b2 i7 C' P
Example 3:拟合曲线(Python)
" {- Y5 m' z: B5 z/ w7 e% _ import csv
' U( c0 j h3 ?' l) r import numpy as np
2 f% |4 ^0 B# K! A% J+ W% g7 Y4 K import pandas as pd
& |' J1 U7 [! X- Y: u. I8 c ^
from datetime import datetime
0 e% P7 |5 }$ ]4 v import matplotlib.pyplot as plt
- O* h0 F, t: n6 s& q9 X ?
import scipy.signal as signal
. e+ d$ s5 _) A data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
8 S4 y' D% j' K% d3 w
time=data[date [AST]]
8 y! C# X# B5 k$ x" ]0 x
temp=data[temperature [C]]
3 p( T2 }/ {8 Y1 m7 l, T4 D
datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
; _/ k H0 N" B
DATE,decday = [],[]
1 e/ d7 C/ M. r2 N for row in time:
6 l" k* K0 C/ `6 v: Q daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
! b4 S7 V' M) g; g) M3 o
DATE.append(daterow)
4 w( } M0 r5 G0 j decday.append((daterow-datestart).total_seconds()/(3600*24))
0 D/ v" K& G l6 P- p. j: [
# First, design the Buterworth filter
: d' R" h1 g9 O' k7 q( }1 U N = 2 # Filter order
: Z/ R1 X) [9 N+ H( P
Wn = 0.01 # Cutoff frequency
7 W) z8 P+ p5 e; Q
B, A = signal.butter(N, Wn, output=ba)
" s1 F2 k$ C# g* f# S% s* A
# Second, apply the filter
4 f6 \9 }3 y8 q: Q: f, O
tempf = signal.filtfilt(B,A, temp)
* X9 J8 u8 G: _0 A) ^ # Make plots
5 ~) b6 {7 [3 w' q3 `8 R/ E: Q fig = plt.figure()
9 i3 I c0 }* l! \% B ax1 = fig.add_subplot(211)
! k# l. |, a& }: X! P% @" o( u
plt.plot(decday,temp, b-)
$ |1 @" ] M# q1 D$ ] plt.plot(decday,tempf, r-,linewidth=2)
9 W% B9 u& @# ^+ L. r' n a. X( N
plt.ylabel("Temperature (oC)")
, x" m% u: D1 R) c1 ~3 \, j0 k plt.legend([Original,Filtered])
1 X- v1 L. @- r( C
plt.title("Temperature from LOBO (Halifax, Canada)")
9 Q1 W* t0 k( e# y9 p9 E% O+ v
ax1.axes.get_xaxis().set_visible(False)
$ J0 ?$ g) q3 K/ Y& e ax1 = fig.add_subplot(212)
2 u+ o" w: T# L1 @& t
plt.plot(decday,temp-tempf, b-)
4 ~* a# | W2 B' L$ D0 a9 e plt.ylabel("Temperature (oC)")
3 h" [, {$ z; s0 r. k$ d9 ~$ L
plt.xlabel("Date")
1 L6 s+ T/ `- r, b! k# {
plt.legend([Residuals])
. f8 A& z! O! w) F" O plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
/ I; e1 F8 z/ A0 L L& [5 D plt.show()
2 P6 u. o* g3 c! g5 E1 N9 w7 `! X

7 S) }. `, J" ^9 o g" x, W Example 4:三维地形(Python)
8 j2 _; m- X( x% S" X& t
# This import registers the 3D projection
% u5 y3 P/ A' f K2 A, P/ l6 r; C
from mpl_toolkits.mplot3d import Axes3D
2 X6 Y" L$ D1 }- X! k- B; P: D
from matplotlib import cbook
! N( T8 N1 ^# {4 J4 b from matplotlib import cm
& W* z [. ?- {" F$ }! Z1 E from matplotlib.colors import LightSource
1 F, u9 ?$ j e& \ v; k9 V6 f( c! E
import matplotlib.pyplot as plt
7 t4 Z$ E3 }! H8 [' a import numpy as np
V ]' P( F' R filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
/ K: E3 ~: ~7 y/ I# u" S8 D
with np.load(filename) as dem:
: o: c# H) M) d- L( R% c
z = dem[elevation]
2 t* R7 L! }* {
nrows, ncols = z.shape
; N! L: @( u/ O% J. `% W
x = np.linspace(dem[xmin], dem[xmax], ncols)
* v' S L Q3 y0 ?# a# b1 z, j
y = np.linspace(dem[ymin], dem[ymax], nrows)
' P2 ^( q+ D7 k2 O' j7 q x, y = np.meshgrid(x, y)
7 \$ S5 S/ g6 d+ ]+ `
region = np.s_[5:50, 5:50]
2 h) R! k# Q! h h: j) O, v3 ? x, y, z = x[region], y[region], z[region]
6 Z) o s0 P1 o+ W fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
7 D! G+ A% s. F( {5 l ls = LightSource(270, 45)
6 s* `# a* I/ M: \
rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
$ o' V+ T, c6 ^8 q; L" P
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
7 b$ r# v/ I0 I8 @
linewidth=0, antialiased=False, shade=False)
9 W: h% d8 U# n plt.savefig(example4.png,dpi=600, bbox_inches=tight)
. e$ N$ C/ Y, c/ {5 N7 B! K
plt.show()
7 O7 x+ {0 t+ F, v3 K 0 I- D/ }9 Q; e$ `
Example 5:三维地形,包含投影(Python)
0 \ n: l# Y: w
! ~; ~$ {! T6 d( A( V- K Example 6:切片,多维数据同时展现(Python)
! h2 f6 h( J" k( h3 k
3 ?% H- x0 m" J6 l% `: u: p Example 7:SSH GIF 动图展现(Matlab)
; ^' d9 V/ Z$ p6 z e/ q
3 { v1 I5 ]! ~6 r
Example 8:Glider GIF 动图展现(Python)
* D2 A3 G. Y% q% Z8 p7 A
, A4 x) \" v. w5 F4 J
Example 9:涡度追踪 GIF 动图展现
; a# I( }* m, }% o: [2 a* g5 s
: u) ]3 ^: c7 a9 w