【Python实现数据可视化】创建3D柱状图
雖然matplotlib主要專注于繪圖,并且主要是二維的圖形,但是它也有一些不同的擴展,能讓我們在地理圖上繪圖,讓我們把Excel和3D圖表結合起來。在matplotlib的世界里,這些擴展叫做工具包(toolkits)。工具包是一些關注在某個話題(如3D繪圖)的特定函數的集合。
比較流行的工具包有Basemap、GTK 工具、Excel工具、Natgrid、AxesGrid和mplot3d。
本節將探索關于mplot3d的更多功能。mpl_toolkits.mplot3工具包提供了一些基本的3D繪圖功能,其支持的圖表類型包括散點圖(scatter)、曲面圖(surf)、線圖(line)和網格圖(mesh)。雖然mplot3d不是一個最好的3D圖形繪制庫,但是它是伴隨著matplotlib產生的,因此我們對其接口已經很熟悉了。
準備工作
基本來講,我們仍然需要創建一個圖表并把想要的坐標軸添加到上面。但不同的是我們為圖表指定的是3D視圖,并且添加的坐標軸是Axes3D。
現在,我們可以使用幾乎相同的函數來繪圖了。當然,函數的參數是不同的,需要為3個坐標軸提供數據。
例如,我們要為函數mpl_toolkits.mplot3d.Axes3D.plot指定xs、ys、zs和zdir參數。其他的參數則直接傳給matplotlib.axes.Axes.plot。下面來解釋一下這些特定的參數。
1.xs和ys:x軸和y軸坐標。
2.zs:這是z軸的坐標值,可以是所有點對應一個值,或者是每個點對應一個值。
3.zdir:決定哪個坐標軸作為z軸的維度(通常是zs,但是也可以是xs或者ys)。
提示:模塊mpl_toolkits.mplot3d.art3d包含了3D artist代碼和將2D artists轉化為3D版本的函數。在該模塊中有一個rotate_axes方法,該方法可以被添加到Axes3D中來對坐標重新排序,這樣坐標軸就與zdir一起旋轉了。zdir默認值為z。在坐標軸前加一個'``-``'會進行反轉轉換,這樣一來,zdir的值就可以是x、-x、y、-y、z或者-z。
操作步驟
以下代碼演示了我們所解釋的概念。
import randomimport numpy as np import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.dates as mdatesfrom mpl_toolkits.mplot3d import Axes3Dmpl.rcParams['font.size'] = 10fig = plt.figure() ax = fig.add_subplot(111, projection='3d')for z in [2011, 2012, 2013, 2014]:xs = xrange(1,13)ys = 1000 * np.random.rand(12)color =plt.cm.Set2(random.choice(xrange(plt.cm.Set2.N)))ax.bar(xs, ys, zs=z, zdir='y', color=color, alpha=0.8)ax.xaxis.set_major_locator(mpl.ticker.FixedLocator(xs)) ax.yaxis.set_major_locator(mpl.ticker.FixedLocator(ys))ax.set_xlabel('Month') ax.set_ylabel('Year') ax.set_zlabel('Sales Net [usd]')plt.show()上述代碼生成如圖5-1所示的圖表。
圖5-1
工作原理
我們需要像在2D世界中那樣做相同的準備工作。不同的是,在這里需要指定后端(backend)的種類。然后生成了一些隨機數據,例如4年的銷售額(2011-2014)。
我們需要為3D坐標軸指定相同的Z值。
從顏色映射集合中隨機選擇一種顏色,然后把它和每一個Z-order集合的xs、ys對關聯起來。最后,用xs、ys對渲染出柱狀條序列。
補充說明
其他的一些matplotlib的2D繪圖函數在這里也是可以用的,例如scatter()和plot()有著相似的接口,但有額外的點標記大小參數。我們對contour、contourf和bar也非常熟悉。
僅在3D中出現的新圖表類型有線框圖(wireframe)、曲面圖(surface)和三翼面圖(tri-surface)。
在下面的示例代碼中,我們繪制了著名的Pringle函數的三翼面圖,數學專業上的叫法是雙曲面拋物線(hyperbolic paraboloid)。
from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm import matplotlib.pyplot as plt import numpy as npn_angles = 36 n_radii = 8# An array of radii # Does not include radius r=0, this is to eliminate duplicate points radii = np.linspace(0.125, 1.0, n_radii)# An array of angles angles = np.linspace(0, 2 * np.pi, n_angles, endpoint=False)# Repeat all angles for each radius angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)# Convert polar (radii, angles) coords to cartesian (x, y) coords # (0, 0) is added here. There are no duplicate points in the (x, y) plane x = np.append(0, (radii * np.cos(angles)).flatten()) y = np.append(0, (radii * np.sin(angles)).flatten())# Pringle surfacez = np.sin(-x * y)fig = plt.figure() ax = fig.gca(projection='3d')ax.plot_trisurf(x, y, z, cmap=cm.jet, linewidth=0.2)plt.show()上面的代碼生成如圖5-2所示的圖形。
圖5-2
本文摘自《Python數據可視化編程實戰》
Python數據可視化編程實戰
內容簡介:
本書是一本使用Python實現數據可視化編程的實戰指南,介紹了如何使用Python最流行的庫,通過60余種方法創建美觀的數據可視化效果。
全書共8章,分別介紹了準備工作環境、了解數據、繪制并定制化圖表、學習更多圖表和定制化、創建3D可視化圖表、用圖像和地圖繪制圖表、使用正確的圖表理解數據以及更多的matplotlib知識。
本書適合那些對Python編程有一定基礎的開發人員閱讀,可以幫助讀者從頭開始了解數據、數據格式、數據可視化,并學會使用Python可視化數據。
點此購買:http://item.jd.com/11676691.html
總結
以上是生活随笔為你收集整理的【Python实现数据可视化】创建3D柱状图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决UnicodeDecodeError
- 下一篇: 信息熵与信息增益的理解