, d F" T+ ^( O4 S7 ? 在我们科研、工作中,将数据完美展现出来尤为重要。
/ p8 O/ Q' _0 Y9 R# Y d8 Z 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
- h* d7 m- b# k
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
( D; I% D7 ~0 O5 ]8 q% d( K0 [! i Example 1 :散点图、密度图(Python)
* o! K n/ p* ?$ [' ~ import numpy as np
6 f# T3 ]$ {) S+ F6 [0 S2 A. `- j import matplotlib.pyplot as plt
' C2 y$ E( Y, I* G # 创建随机数
3 j7 w; S2 w% D4 b& X, n n = 100000
0 X v; u3 D% l1 m" A x = np.random.randn(n)
& n( c$ j s/ }4 f7 P2 H y = (1.5 * x) + np.random.randn(n)
. ]! o O0 l7 i
fig1 = plt.figure()
0 H+ \2 h# g% h6 F& Q# w! l
plt.plot(x,y,.r)
. y: c8 p) {5 M4 h p plt.xlabel(x)
7 w! [; ~4 I! M3 W0 M( \' T3 K
plt.ylabel(y)
& ?3 P- O1 V( h# W! Q$ M
plt.savefig(2D_1V1.png,dpi=600)
4 u g$ @( m* H9 J4 Q8 P& X
nbins = 200
: m- m% D& X' I: O' E H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
0 H; j: v1 Z5 U! O
# H needs to be rotated and flipped
( v# k! q! \6 W! A! }& S
H = np.rot90(H)
% n/ c. l6 u3 u) ` H = np.flipud(H)
* a3 Q$ y" H# d+ {& i; d6 b: f # 将zeros mask
7 f9 O3 \- p( o" C6 G
Hmasked = np.ma.masked_where(H==0,H)
' Q" i1 m6 a$ o0 d Y I
# Plot 2D histogram using pcolor
. k% @6 Z" E' y: S; @ fig2 = plt.figure()
9 H& \. s I8 H- G" ^
plt.pcolormesh(xedges,yedges,Hmasked)
4 J6 e0 p/ H+ q- H5 L
plt.xlabel(x)
0 p0 X! M. _; E, ^* Y" V0 o/ o: F
plt.ylabel(y)
3 J" w# u) G4 U( M2 A# G
cbar = plt.colorbar()
F7 ?- C* C9 l- ?: h4 w* P: n
cbar.ax.set_ylabel(Counts)
1 v, ~: N4 t/ k8 c, d( V3 z plt.savefig(2D_2V1.png,dpi=600)
4 U! o2 ~# L3 l* f$ n
plt.show()
@# H8 { |7 c
& k) N v+ H' }% V& `
" Q- H) u2 M, ]. ^1 w 打开凤凰新闻,查看更多高清图片
5 ] R/ `6 V- q g
# i* X1 b7 {* L
6 y6 v0 u/ M$ u+ E7 g7 K9 z 
, _( D5 }" O% A7 p7 J& P0 ~/ n/ J Example 2 :双Y轴(Python)
* _" L( h7 r7 [* J6 k) f9 s
import csv
1 y @! I# r6 o# [( e2 ]
import pandas as pd
8 U8 Y4 \) h, H4 h import matplotlib.pyplot as plt
% P1 y0 P9 T3 z# u# W& g
from datetime import datetime
) T; G! M: d9 V1 K4 d data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
! S) A. F+ j7 A4 ?) F2 X
time=data[date [AST]]
) r0 @0 |# `+ d1 f
sal=data[salinity]
+ \) Q$ O( D4 p tem=data[temperature [C]]
) |$ q# G; n7 y# b6 e
print(sal)
3 O4 d( b6 ~8 t" W5 l* x
DAT = []
$ i% b3 d1 z7 y& g
for row in time:
. D2 x) S# E- s& M1 `5 B5 \6 k8 _% O M DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
" b/ R3 J) C. I: P! n" v6 K' s #create figure
( A" @! E8 M' j- u' G fig, ax =plt.subplots(1)
. \8 l3 G1 o8 _. {' D
# Plot y1 vs x in blue on the left vertical axis.
, b; G7 o! A$ Y/ D8 T( G$ W6 G" D
plt.xlabel("Date [AST]")
5 S# C& d) c- t
plt.ylabel("Temperature [C]", color="b")
4 p" x+ s# D. ?( R$ v% b
plt.tick_params(axis="y", labelcolor="b")
& m( o! j; U( L+ I$ h1 I3 L. k plt.plot(DAT, tem, "b-", linewidth=1)
9 Z$ E! p; t1 }9 O% J4 m8 J
plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
$ m' {' d0 Y- p# `
fig.autofmt_xdate(rotation=50)
* V) }( i X5 N8 Y # Plot y2 vs x in red on the right vertical axis.
' v0 T# q# r2 A4 J& v
plt.twinx()
% o2 s* J" J3 P. ` plt.ylabel("Salinity", color="r")
: E) d* r/ t! y3 G8 H
plt.tick_params(axis="y", labelcolor="r")
$ v9 f" x0 \6 f" W% m
plt.plot(DAT, sal, "r-", linewidth=1)
. Q6 L7 i( J- p9 c #To save your graph
4 Q) o7 R3 A- l9 {# l plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
* b0 _; ?. q% \- b
plt.show()
+ y" K0 @/ ]# R$ o6 A d" C 
; {' m8 @6 l" d% C4 H
Example 3:拟合曲线(Python)
: b% \& X$ {1 z) C1 h& O
import csv
: {% i, V2 }1 W% }3 b9 E8 G* \ import numpy as np
3 ?( g* s' c* X" L! D import pandas as pd
9 P' ]+ X X, ~ [0 _
from datetime import datetime
E3 s$ i8 _! C( `' H5 ^1 ` import matplotlib.pyplot as plt
' R. }7 M5 a8 T; X& F
import scipy.signal as signal
/ V: }/ O' W: j6 F& k2 {7 J" E
data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
! J1 o+ h3 {- j$ ]/ a- d( Q time=data[date [AST]]
0 c g& Y! a& Q* k0 h. }& T
temp=data[temperature [C]]
2 e* c) L7 H" k( U, g$ h3 ?- U
datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
+ W, O4 u: B$ y; B8 W- o- _7 {
DATE,decday = [],[]
+ K$ M) U+ t0 Q# S7 U3 X for row in time:
! D; O2 x# h5 u: C7 b9 U
daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
% F/ h# {; E j* `# p/ y DATE.append(daterow)
+ `. Y$ v4 X2 H decday.append((daterow-datestart).total_seconds()/(3600*24))
' m! d$ T* w' Y* h # First, design the Buterworth filter
# D4 ^, F# j2 Z N = 2 # Filter order
5 S, P4 |$ i( f1 W+ l3 Z& k( q
Wn = 0.01 # Cutoff frequency
! e; Q, ^& V9 l$ J8 K
B, A = signal.butter(N, Wn, output=ba)
& v# V7 R6 T1 L4 _- e9 Y
# Second, apply the filter
$ c( f5 j7 T# h/ _& W/ m$ O$ M tempf = signal.filtfilt(B,A, temp)
+ d& K: N% U9 I* m # Make plots
2 v. d2 r# W$ ]6 @, _
fig = plt.figure()
2 v. M# V; C/ {9 m2 `" a
ax1 = fig.add_subplot(211)
( A' I0 m" q4 @) T3 {- M. q$ z plt.plot(decday,temp, b-)
* w. P* I! F/ X) v9 D; ^
plt.plot(decday,tempf, r-,linewidth=2)
& G% z7 G! Q1 s4 _- _
plt.ylabel("Temperature (oC)")
) U! p) X ^* h- W- i$ S9 K* \
plt.legend([Original,Filtered])
- t& J7 j: J9 h plt.title("Temperature from LOBO (Halifax, Canada)")
* S1 d3 o# D! `6 u+ H ax1.axes.get_xaxis().set_visible(False)
4 C- @7 Q4 u( @1 Z1 b# I
ax1 = fig.add_subplot(212)
3 E0 d( Y; ]& D- K# I plt.plot(decday,temp-tempf, b-)
% y s F9 a* C2 ~ plt.ylabel("Temperature (oC)")
) ]# Z8 c y$ J$ {8 q/ n/ o
plt.xlabel("Date")
$ a% Y; y6 g: e9 H plt.legend([Residuals])
& ? y2 D. J( ?/ R' ` plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
: Z9 I I/ L' t) T. D! T plt.show()
+ s. L% B- ~# F: w

7 Q9 h1 L e1 Y" |: A7 Y# U( _7 v Example 4:三维地形(Python)
5 Z# w+ b3 I/ g( a) u( V+ ?" V # This import registers the 3D projection
# u" b$ y8 }- j0 J from mpl_toolkits.mplot3d import Axes3D
! S6 \) q6 l; |2 x7 a1 u from matplotlib import cbook
8 C5 r- W3 r7 i6 N0 ?2 K4 ~( L
from matplotlib import cm
3 K- j; i7 g2 i1 I5 {
from matplotlib.colors import LightSource
`" V% r$ V/ k" \* h: M# u. T
import matplotlib.pyplot as plt
. C9 ~; g3 |+ N
import numpy as np
* w8 H2 o! Q( T7 S) G5 {6 q filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
3 A; x' H' h% T( l
with np.load(filename) as dem:
; K* N) Z% O3 [$ v9 r# t0 n
z = dem[elevation]
, h$ p8 N6 V1 r5 \6 \& c2 I
nrows, ncols = z.shape
T5 W4 C( X9 n T% s9 S
x = np.linspace(dem[xmin], dem[xmax], ncols)
' [7 l! y& U7 O K; M
y = np.linspace(dem[ymin], dem[ymax], nrows)
, {1 g, }+ z4 N/ A1 r7 D
x, y = np.meshgrid(x, y)
& e N* y' C5 x$ e2 r3 i
region = np.s_[5:50, 5:50]
; s+ y2 [8 a$ }( l* W: p
x, y, z = x[region], y[region], z[region]
$ }+ y2 G! J( s, f fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
0 ~2 `3 s: L5 J
ls = LightSource(270, 45)
9 u4 Q+ @. c l0 d% _- |2 E rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
. e. u( K. g8 K
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
0 O" L0 S0 Z1 E* k M& W linewidth=0, antialiased=False, shade=False)
; A& N- t' j, b* k# i4 P k8 Z7 g plt.savefig(example4.png,dpi=600, bbox_inches=tight)
% W2 }( L/ U0 V; |
plt.show()
+ q/ Y* E& N* |+ t d, K1 A
! b& i9 v' p5 m& y r/ h6 M1 H Example 5:三维地形,包含投影(Python)
2 F3 f3 g7 E* d' J: E$ p + j c R8 {% C8 A* M
Example 6:切片,多维数据同时展现(Python)
; i* W/ G7 u( |: E4 [+ {
# D. ]7 C' c- ]6 `& Z, P+ Y9 }& `
Example 7:SSH GIF 动图展现(Matlab)
5 R: k% v1 o1 [2 i
. p1 f3 e o& h1 s ~, _" T" U5 q Example 8:Glider GIF 动图展现(Python)
& s9 D* c! M& F+ F
$ |5 ^5 D, c8 [9 i0 c) c6 w
Example 9:涡度追踪 GIF 动图展现
, i; p$ ]* ~6 I0 _( \ B , T0 f q4 l9 Q" M2 b& t