$ U* \1 I: u- m6 b) P
在我们科研、工作中,将数据完美展现出来尤为重要。
/ b9 f" |* b" \; o; h; J; y$ Z) M, U5 j
数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
7 d* S* y/ r# M/ D. G) b
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
& B, p% z' [9 J Example 1 :散点图、密度图(Python)
- w! [( @! Y/ ~ import numpy as np
8 V+ v6 v3 u% e3 @6 O6 m' Z5 d import matplotlib.pyplot as plt
: f" a$ g j) w+ N( R. e # 创建随机数
/ B1 F3 w- g6 f. q; T8 f( j, C
n = 100000
- w7 K! B2 z. N# d: j& i
x = np.random.randn(n)
6 t! r1 K" g& `. U. J8 V y = (1.5 * x) + np.random.randn(n)
7 ~9 U7 ~- \0 b2 T, ?; o6 {' A
fig1 = plt.figure()
7 g0 {4 l: B' x, u! Y
plt.plot(x,y,.r)
/ o) x* ^. U( B$ _, q! c
plt.xlabel(x)
8 j: V+ ?# l/ f+ c
plt.ylabel(y)
' \- C- i9 D! j, u4 A- H
plt.savefig(2D_1V1.png,dpi=600)
" a. |5 k4 \! d" M5 ~; V
nbins = 200
. A) B. N8 ^ k$ p: r8 `
H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
# W6 A& D) ~+ M `9 i
# H needs to be rotated and flipped
7 ?% I! s) v- A H = np.rot90(H)
5 U5 z; O( y+ b, ^2 m9 W. y8 H8 d
H = np.flipud(H)
6 k, \5 }/ p( a; A& N9 }) L # 将zeros mask
$ m F1 c+ `, |/ }
Hmasked = np.ma.masked_where(H==0,H)
- ]( B6 x9 p1 Z t# f0 ` # Plot 2D histogram using pcolor
" v, h; V9 g' N+ T9 s4 d fig2 = plt.figure()
/ e# O" W n$ y
plt.pcolormesh(xedges,yedges,Hmasked)
! P: {/ ], Y4 I. s( t plt.xlabel(x)
: u1 V0 C8 h1 o1 v/ t0 h; J plt.ylabel(y)
- [1 t( x, ?& H" m# S( a+ [
cbar = plt.colorbar()
3 X: k& x- M% \; n2 Q cbar.ax.set_ylabel(Counts)
1 Y! b& x* z/ J- B
plt.savefig(2D_2V1.png,dpi=600)
/ j3 @5 d3 p! K! ~* U/ _ plt.show()
: N- @$ T1 l, Z9 E
# K8 p! ~. }, C/ p) a
: N) |) N$ f6 O ^ 打开凤凰新闻,查看更多高清图片
" g" T% N4 ^9 |+ J) L" X+ T3 O3 P- t2 v 4 g2 x2 V! ?& D
7 {2 \ c7 U! M1 Q 
* m" M8 ]6 ^# Y; f5 V; X, U Example 2 :双Y轴(Python)
% U+ c$ H# Z6 Z9 V) c/ Q import csv
. A6 m6 q$ n" g import pandas as pd
* ~7 W% ]: Q s# B
import matplotlib.pyplot as plt
7 Q2 O5 L+ E* ^0 [; P% m! D2 X
from datetime import datetime
|/ }6 {3 H4 B) I q% ~- \ data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
7 G) f% i: M8 h' D, ]. y- f; T
time=data[date [AST]]
1 ]. U: @ ~, ^; m) D
sal=data[salinity]
2 R Q0 E M9 M2 m tem=data[temperature [C]]
- Y3 f* j; D/ l+ _ print(sal)
: g, {; \; D! Q: v: D DAT = []
. r2 i1 h6 @- T. {. E/ c6 u for row in time:
1 @( v% _; I3 v- N- r/ h w7 M8 A7 R DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
' Q9 W( n/ Q+ v3 z) j( Z
#create figure
( Y; r% p$ N' r9 [6 | fig, ax =plt.subplots(1)
: ~+ m# D+ U5 l1 W5 u# \" D # Plot y1 vs x in blue on the left vertical axis.
6 ?, ~- r, B7 B: i5 A; L plt.xlabel("Date [AST]")
* I) A7 v% Q/ S" \1 g7 ]
plt.ylabel("Temperature [C]", color="b")
& p8 F4 x2 |' P% r; G+ ~0 s5 v7 w+ R plt.tick_params(axis="y", labelcolor="b")
! c f% c, k1 t3 r1 S" F9 T
plt.plot(DAT, tem, "b-", linewidth=1)
9 d! ?) K/ X) z plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
: s6 I% v- P4 g6 f5 W- v5 }% S fig.autofmt_xdate(rotation=50)
& |2 ?4 \1 w0 a" p
# Plot y2 vs x in red on the right vertical axis.
6 Y/ G, d, j/ l8 `
plt.twinx()
- M( ^. X: z- s9 ^( ^ plt.ylabel("Salinity", color="r")
; o2 j( ]2 t7 |" E* R5 K+ B# {3 h% f
plt.tick_params(axis="y", labelcolor="r")
7 k# @4 L0 H. E
plt.plot(DAT, sal, "r-", linewidth=1)
3 {& i/ ^8 I) W( B0 O. Y( Q# P #To save your graph
9 u4 ?/ A4 H/ q4 C! }3 s' |
plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
( S, P+ S) C3 A5 V7 I plt.show()
. C, k; h t4 I( x3 f. E

( J# u- e8 l9 K) y$ c" n: o6 R- q3 v Example 3:拟合曲线(Python)
K* x/ K1 N) F- u* g5 m import csv
' c' R5 b; L8 F- q% ]* }2 S, N5 Z import numpy as np
/ H' e2 ]4 Z$ b: }$ z& t
import pandas as pd
' D9 p+ E+ w0 N, c
from datetime import datetime
0 E# O: J9 ~3 X- O; ~# H import matplotlib.pyplot as plt
0 X8 y: Y: {0 a) O
import scipy.signal as signal
, X. b' Q0 \5 b8 d+ N+ u" p data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
' q! J+ D8 B' u2 |7 S7 ^
time=data[date [AST]]
% F- c( M; r% u+ ?( [, j temp=data[temperature [C]]
: k7 |; C- ]* y2 ?% X datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
1 M0 y" r4 j) S, s( [" P/ U
DATE,decday = [],[]
, y. u: h- u, } l2 N3 q for row in time:
3 C$ }! V8 @3 H& ^* _& q8 j) \ daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
0 C& F. ]: m* c' X% u. n
DATE.append(daterow)
! N- v/ i- R5 h decday.append((daterow-datestart).total_seconds()/(3600*24))
& r4 q/ g' d/ J # First, design the Buterworth filter
" f& m7 e5 `2 O. n5 u N = 2 # Filter order
4 W! y4 {( p% q; H
Wn = 0.01 # Cutoff frequency
- [, \( M& {" B9 U B, A = signal.butter(N, Wn, output=ba)
# X! Z) o, J7 ?7 P9 ^0 T! b8 M # Second, apply the filter
, C6 \3 t; B+ k0 U" L tempf = signal.filtfilt(B,A, temp)
4 v0 X3 J N! k # Make plots
0 {; u! C( E! W fig = plt.figure()
0 w4 ]! k" t) [
ax1 = fig.add_subplot(211)
' Q- u# Y2 j8 z* g* o/ |) v
plt.plot(decday,temp, b-)
) ?+ N+ `8 }* m7 }" o plt.plot(decday,tempf, r-,linewidth=2)
3 P' N: [' L0 {/ j% `8 S0 K! | plt.ylabel("Temperature (oC)")
) F* Z& g2 `2 @. n. ^ plt.legend([Original,Filtered])
4 n( K" g1 x. |7 ~0 s- `! A plt.title("Temperature from LOBO (Halifax, Canada)")
6 P1 K7 h+ N! ^* K
ax1.axes.get_xaxis().set_visible(False)
& ~, r7 V& M* H2 @$ H ax1 = fig.add_subplot(212)
! E* [7 M, p0 O9 f4 ^ V( T plt.plot(decday,temp-tempf, b-)
5 W, }3 Q. o$ u& P6 W, @, Z
plt.ylabel("Temperature (oC)")
% V( a& k8 `3 i5 ~ plt.xlabel("Date")
; `# d" W `" M4 H
plt.legend([Residuals])
0 O, ~3 ]* e2 a% y" I) F! x plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
; H( C% m# V2 o! [. u" A8 m( t1 `' D plt.show()
+ y; ^2 c. }; I$ p) e) r- m( U' s 
0 G. ^ o' Z; a# \) q F/ ] Example 4:三维地形(Python)
$ E* o( O J6 }: [
# This import registers the 3D projection
( A- }! v1 m4 S6 n& `* Y6 s% W. p
from mpl_toolkits.mplot3d import Axes3D
0 q' x+ F: M) d$ A% b
from matplotlib import cbook
4 U/ L- _. ~. G, m from matplotlib import cm
* p! C+ t0 {$ q$ q1 `8 `+ V from matplotlib.colors import LightSource
6 X7 D9 H) R. t: b; d9 ?7 o
import matplotlib.pyplot as plt
( N& d2 R {0 w8 h, a7 F& g/ W import numpy as np
; g- ^# c; \! r9 w* j5 j
filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
1 @* C( y5 {; r. L5 a; I0 V
with np.load(filename) as dem:
% M: B( Z: A' M7 M" p
z = dem[elevation]
" g% O* e Z% J) g H, m0 j
nrows, ncols = z.shape
4 z: F7 k7 C: ?, [
x = np.linspace(dem[xmin], dem[xmax], ncols)
8 I1 |+ x. V" D3 ^, D' L$ K$ F
y = np.linspace(dem[ymin], dem[ymax], nrows)
" [) x. n8 C( A! a$ L, W6 R5 Q
x, y = np.meshgrid(x, y)
8 {1 O* h' v5 Q& \( k* B& @ region = np.s_[5:50, 5:50]
3 g3 {3 S; t/ T" [# Z+ k% T4 O9 v
x, y, z = x[region], y[region], z[region]
" H0 _1 i' @$ c fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
3 W# Z8 o1 B' J/ V+ \8 E% B ls = LightSource(270, 45)
1 c( H7 D0 v9 f3 Q3 f) z
rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
5 s* t; |& U' W8 z/ ]
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
* S* H+ [# @ h F) O0 A linewidth=0, antialiased=False, shade=False)
% ^8 A3 U+ ?' S7 E0 H; i3 m
plt.savefig(example4.png,dpi=600, bbox_inches=tight)
, S7 p8 B1 j' s% u, Z* m1 c9 ~ plt.show()
) w H! K9 L( ]4 S! g) [! { 9 L2 j8 E: @1 M) e
Example 5:三维地形,包含投影(Python)
7 S3 n: W J# u& {# h
1 w* t1 j0 P; Y
Example 6:切片,多维数据同时展现(Python)
. e' M: f% z Q2 i$ c+ r# P
; v P7 o I3 K Example 7:SSH GIF 动图展现(Matlab)
1 _' \3 }" k d- s' v
0 G! q5 t9 \( `, E2 ]) k Example 8:Glider GIF 动图展现(Python)
, E* g. P Y) s+ G0 M % X! c7 ?7 \1 r4 ?' U3 F
Example 9:涡度追踪 GIF 动图展现
$ ?+ |6 y0 F6 ^& P9 r* ?2 M
! x* J) V4 p2 S; H0 ^