日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【Python进阶】带你使用Matplotlib进行可视化

發布時間:2025/3/20 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python进阶】带你使用Matplotlib进行可视化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

歡迎來到專欄《Python進階》。在這個專欄中,我們會講述Python的各種進階操作,包括Python對文件、數據的處理,Python各種好用的庫如NumPy、Scipy、Matplotlib、Pandas的使用等等。我們的初心就是帶大家更好的掌握Python這門語言,讓它能為我所用。

今天是《Python進階》專欄的第五期,在本期中,我們將主要介紹如何使用Matplotlib這個第三方庫進行數據可視化。

作者&編輯 | 湯興旺

“美麗的可視化可反映出所描述數據的品質,顯式地揭示出源數據中內在和隱式的屬性和關系,讀者了解了這些屬性和關系之后,可以因此而獲取新的知識、洞察力和樂趣。”

以上是書籍《數據可視化之美》對可視化的解讀。說的很有道理,相信大家聽說過“一圖勝千言”這句話,當看到一堆數據時,若你對數字不夠敏感,肯定會費勁半天找不到規律,但若用一張圖來表達時,相信你一定會一目了然。下面我就大家使用Matplotlib對數據進行美麗的可視化。

1?Matplotlib 的基本操作

在Matplotlib中有三個基本概念,分別是Figure、axes和axis。

下面我來詳細解釋下這三個基本概念。在Matplotlib中,figure你可以理解成一個畫布或者一個窗口,axes是指畫布上的一個區域,你畫的圖就在這個區域上。你可以把figure看成一張白紙,在紙上的任何區域畫圖,確定畫圖區域并確定作圖的一些方式的東西的就是axes,即坐標對象(坐標系)。

由于在一張白紙上可以有幾個區域進行畫圖,另外畫圖區域必須存在于白紙上才有意義。因此在figure上可有多個axes,axes必在figure上,要畫圖必有axes。

另外axis就是我們平時常見的坐標軸,如x軸、y軸等。

對于上面的概念我們可以用下圖進行直觀理解。

通過上面的講解,我們知道在Matplotlib中的圖像都位于figure畫布中,因此可以使用plt.figure創建一個新畫布。如果要在一個圖表中繪制多個子圖,可使用subplot。


話不多說,我們直接看下面代碼:

import matplotlib.pyplot as plt

ax4 = fig.add_subplot(2, 2, 4)

首先,創建了一個figure,然后在這個figure上畫了四個區域,即四個子圖,分別是直方圖、三點圖、折線圖,還有一個是只有坐標軸的圖。

如果我想要畫多個figure應該怎么辦呢?實際上如果要同時繪制多個圖表,可以給figure()傳遞一個整數參數指定figure對象的序號。如下例所示:

import matplotlib.pyplot as plt

import numpy as np

plt.figure(1)? # 創建圖表1

plt.figure(2)? # 創建圖表2

ax1 = plt.subplot(211)? # 在圖表2中創建子圖1

ax2 = plt.subplot(212)? # 在圖表2中創建子圖2

x = np.linspace(0, 3, 100)

for i in range(5):

? ? plt.figure(1)? # 選擇圖表1

? ? plt.plot(x, np.exp(i * x / 3))

? ? plt.sca(ax1)? # 選擇圖表2的子圖1

? ? plt.plot(x, np.sin(i * x))

? ? plt.sca(ax2)? # 選擇圖表2的子圖2

? ? plt.plot(x, np.cos(i * x))

plt.show()

執行完上面代碼后,如下圖。

2 Matplotlib的進階操作

在1中的兩個示例中,我們會發現手動創建figure,都使用了plt.figure()。如果沒有plt.figure()可以嗎?請看下面的示例:

import matplotlib.pyplot as plt

import numpy as np

x = np.linspace(-np.pi, 5*np.pi, num = 100)

y = np.sin(x)

plt.plot(x,y)

plt.show()

我們會發現這段代碼中,沒有plt.figure()也畫出了圖,WHY?難道前面誤導了大家?我在前面說過,若沒有figure就沒有axes!

當然這個鍋我不背,實際上這里plt.plot()是通過plt.gca()獲得當前axes對象的ax,如果沒有會自動創建一個,可以理解為就是figure。然后再調用ax.plot方法實現真正的繪圖。

Matplotlib實際上是一套面向對象的繪圖庫,它所繪制的圖表中每個圖表元素,如線條 Line2D、文字Text、刻度等在內存中都有一個對象與之對應。為將面向對象的繪圖庫包裝成只使用函數的調用接口,pyplot模塊內部保存了當前圖表以及當前子圖等信息。當前的圖表和子圖可以使用plt.gcf()plt.gca()獲得,分別表示"Get Current Figure"和"Get Current Axes"。在pyplot模塊中,許多函數都是對當前的figure或axes對象進行處理,比如說:

plt.plot()實際上會通過plt.gca()獲得當前的axes對象ax,然后再調用ax.plot()方法實現真正繪圖。

2.1 對圖進行裝扮

上面3個示例中均沒有展示圖例、標注等,下面我們通過下面的示例來分享如何對一個圖進行裝扮。

import matplotlib.pyplot as plt

import numpy as np

fig, ax1 = plt.subplots(figsize=(8, 4))

r = np.linspace(0, 10, 100)

a = 4 * np.pi * r ** 2? # area

v = (4 * np.pi / 3) * r ** 3? # volume

ax1.set_title("surface area and volume of a sphere", fontsize=16)

ax1.set_xlabel("radius [m]", fontsize=16)

ax1.plot(r, a, lw=2, color="blue")

ax1.set_ylabel(r"surface area ($m^2$)", fontsize=16, color="blue")

for label in ax1.get_yticklabels():

? ? label.set_color("blue")

ax2 = ax1.twinx()

ax2.plot(r, v, lw=2, color="red")

ax2.set_ylabel(r"volume ($m^3$)", fontsize=16, color="red")

for label in ax2.get_yticklabels():

? ? label.set_color("red")

fig.tight_layout()

plt.show()

在上面的示例中我們通過set.title()設置了圖的標題,通過set_xlabel和set_ylabel設置了y軸的標簽,另外也通過get_yticklabels()和get_xticklabels()設置了坐標軸上刻度的不同的屬性。

2.2、對圖的某個細節進行放大


平時我們在處理圖的時候,有時候需要對圖的局部細節進行查看,這時候就需要對細節進行放大,對于這個問題該怎么解決呢?請看下面的案例:

import matplotlib.pyplot as plt

如果我想要對上圖的橫縱標在4附近的局部峰值進行放大查看,即下圖圈紅部分進行放大查看,應該如何操作呢?

代碼如下:

import matplotlib.pyplot as plt

import numpy as np

import matplotlib as mpl

fig = plt.figure(figsize=(8, 4))

def f(x):

? ? return 1 / (1 + x ** 2) + 0.1 / (1 + ((3 - x) / 0.1) ** 2)

def plot_and_format_axes(ax, x, f, fontsize):

? ? ax.plot(x, f(x), linewidth=2)

? ? ax.xaxis.set_major_locator(mpl.ticker.MaxNLocator(5))

? ? ax.yaxis.set_major_locator(mpl.ticker.MaxNLocator(4))

? ? ax.set_xlabel(r"$x$", fontsize=fontsize)

? ? ax.set_ylabel(r"$f(x)$", fontsize=fontsize)

ax = fig.add_axes([0.1, 0.15, 0.8, 0.8], facecolor="#f5f5f5")

x = np.linspace(-4, 14, 1000)

plot_and_format_axes(ax, x, f, 18)

x0, x1 = 2.5, 3.5

ax = fig.add_axes([0.5, 0.5, 0.38, 0.42], facecolor='none')

x = np.linspace(x0, x1, 1000)

plot_and_format_axes(ax, x, f, 14)

plt.show()

代碼區紅色部分即實現放大部分的代碼。實際是添加了另外一個axes,只不過這個axes包含在主圖的axes中。

總結

本期我們介紹了Matplotlib中的一些應用,希望您能借助這個工具畫出精美的圖表。

下期預告:Python庫Pandas的高級應用

知識星球推薦

有三AI編程與開源框架知識星球由我親自維護,內設caffe實戰,Python實戰,Python每日一練,Pytorch實戰、C++每一一練等板塊。近期我重點更新caffe的實戰教程,包括模型定義、數據處理、源碼解讀、定制自己的caffe等等,歡迎大家了解加入,我們一起攻破編程與開源框架。

轉載文章請后臺聯系

侵權必究

往期精選

  • 【Python進階】Python進階專欄、編程與開源框架知識星球上線,等你來follow

  • 【Python進階】實戰Python圖像文件操作基本編程

  • 【雜談】菜鳥誤入linux會有哪些慘痛的經歷

  • 【Python進階】你的真的明白NumPy中的ndarray嗎?

  • 【Python進階】Python中的異常處理

  • 【TensorFlow2.0】以后我們再也離不開Keras了?

  • 【TensorFlow2.0】數據讀取與使用方式

  • 【TensorFlow2.0】如何搭建網絡模型

總結

以上是生活随笔為你收集整理的【Python进阶】带你使用Matplotlib进行可视化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。