【Python】模塊學習之matplotlib柱狀圖、餅狀圖、動態圖及解決中文顯示問題


前言

眾所周知,通過數據繪圖,我們可以將枯燥的數字轉換成容易被人們接受的圖表,從而讓人留下更加深刻的印象。而大多數編程語言都有自己的繪圖工具,matplotlib就是基於Python的繪圖工具包,使用它我們可以僅僅使用幾行代碼就生成 餅圖、直方圖、功率譜、條形圖、錯誤圖、散點圖、氣泡圖,甚至生成動態圖型也都很輕松。而且它的繪圖方法豐富,可以在各種交互式環境中運行,且生成的圖像質量高、兼容各種硬拷貝格式。

博主也是在測試一個算法的時候,為了更直觀的呈現數據走向,學習了它的相關用法,這篇博客大部分內容是在此過程中的學習筆記。

matplotlib的官網地址是https://matplotlib.org/gallery,下面這些是他們官網的一些示例圖形。



安裝

pip安裝

Matplotlib的安裝比較容易,可以直接通過pip安裝,也可以通過下載安裝包的方式安裝。博主使用的是python3,相關的安裝命令如下:

pip3 install matplotlib

安裝包安裝

如果你的Python3可以直接點擊下面的py3鏈接下載進行安裝,則點擊可以點擊其他python版本下載對應Python版本進行安裝
matplotlib-1.4.3.win-amd64-py3

其他python版本

柱狀圖

主要方法

用python畫柱狀圖很容易,主要的方法是:

atplotlib.pyplot.bar(left, height, width=0.8, bottom=None, hold=None, data=None, **kwargs)

參數說明

  • left: 每一個柱形左側的X坐標
  • height:每一個柱形的高度
  • width: 柱形之間的寬度
  • bottom: 柱形的Y坐標
  • color: 柱形的顏色

示例代碼

import matplotlib.pyplot as plt
import time

source_data = {'mock_verify': 369, 'mock_notify': 192, 'mock_sale': 517}  # 設置原始數據

for a, b in source_data.items():
    plt.text(a, b + 0.05, '%.0f' % b, ha='center', va='bottom', fontsize=11)  # ha 文字指定在柱體中間, va指定文字位置 fontsize指定文字體大小

# 設置X軸Y軸數據,兩者都可以是list或者tuple
x_axis = tuple(source_data.keys())
y_axis = tuple(source_data.values())
plt.bar(x_axis, y_axis, color='rgb')  # 如果不指定color,所有的柱體都會是一個顏色

plt.xlabel(u"渠道名")  # 指定x軸描述信息
plt.ylabel(u"訪問量")  # 指定y軸描述信息
plt.title("渠道訪問量統計表")  # 指定圖表描述信息
plt.ylim(0, 600)  # 指定Y軸的高度
plt.savefig('{}.png'.format(time.strftime('%Y%m%d%H%M%S')))  # 保存為圖片
plt.show()

效果圖

解決中文顯示問題

從上面的圖片看到,matplotlib繪制圖像顯示中文時,中文會變成小方格子。搜了很多資料,最佳的解決方法是動態設置參數,添加下面的代碼。

from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認字體
mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示為方塊的問題

修改后的圖片

餅狀圖

主要方法

用python畫柱狀圖的主要方法如下:

plt.pie(x=fracs, labels=labels, explode=explode, autopct='%3.1f %%',shadow=False, labeldistance=1.1, startangle=0, pctdistance=0.8)

示例代碼

相關的參數已在注釋中說明

import matplotlib.pyplot as plt
data = {'8516464': 106, '8085460': 704, '7593813': 491, '8709362': 24, '8707829': 6, '8684658': 23, '8679301': 11,
        '8665923': 29, '8660909': 23, '8652968': 31, '8631727': 31, '8622935': 24, '8620593': 18, '8521737': 33,
        '8605441': 49, '8495205': 82, '8477276': 57,'8474489': 71, '8456502': 50, '8446529': 68, '8433830': 136,
        '8254158': 103, '8176029': 88, '8081724': 58, '7922592': 185, '7850099': 62,'7617723': 61, '7615562': 90,
        '7615052': 57, '7604151': 102, '7511294': 59,'6951654': 27, '6946388': 142, '6945373': 159, '6937716': 347,
        '7460176': 64, '7246377': 87, '7240621': 145, '7204707': 645, '7028401': 671}
source_data = sorted(data.items(), key=lambda x: x[1], reverse=True)
print(source_data)
labels = [source_data[i][0][:4] for i in range(len(source_data))]  # 設置標簽
fracs = [source_data[i][1] for i in range(len(source_data))]
explode = [x * 0.01 for x in range(len(source_data))]  # 與labels一一對應,數值越大離中心區越遠
plt.axes(aspect=1)  # 設置X軸 Y軸比例
# labeldistance標簽離中心距離  pctdistance百分百數據離中心區距離 autopct 百分比的格式 shadow陰影
plt.pie(x=fracs, labels=labels, explode=explode, autopct='%3.1f %%',
        shadow=False, labeldistance=1.1, startangle=0, pctdistance=0.8, center=(-1, 0))
# 控制位置:bbox_to_anchor數組中,前者控制左右移動,后者控制上下。ncol控制 圖例所列的列數。默認值為1。fancybox 圓邊
plt.legend(loc=7, bbox_to_anchor=(1.2, 0.80), ncol=3, fancybox=True, shadow=True, fontsize=8)
plt.show()

效果圖

動態圖

主要方法

用python畫動態圖的主要方法如下:

ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
                    init_func=init, blit=True)

動態圖官方使用介紹

可以訪問下面的鏈接查看它官網的使用介紹

示例代碼

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import time
# Fixing random state for reproducibility
np.random.seed(196)
# 初始數據繪圖
dis = np.zeros(40)
dis2 = dis
fig, ax = plt.subplots()
line, = ax.plot(dis)
ax.set_ylim(-1, 1)
plt.grid(True)
ax.set_ylabel("distance: m")
ax.set_xlabel("time")

def update(frame):
    global dis
    global dis2
    global line
    # 讀入模擬
    a = np.random.rand() * 2 - 1
    time.sleep(np.random.rand() / 10)
    # 繪圖數據生成
    dis[0:-1] = dis2[1:]
    dis[-1] = a
    dis2 = dis
    # 繪圖
    line.set_ydata(dis)
    # 顏色設置
    plt.setp(line, 'color', 'c', 'linewidth', 2.0)
ani = animation.FuncAnimation(fig, update, frames=None, interval=100)
plt.show()

效果圖:

顏色設置

matplotlib中對顯示的字體和顏色都可以進行定制:

內建顏色

內建顏色 藍色 綠色 紅色 青色 品紅 黃色 黑色
對應字符 'b' 'g' 'r' 'c' 'm' 'y' 'k'

其他顏色

其他的顏色使用可以參考下面這篇博客

字體設置

字體 對應字體
黑體 SimHei
微軟雅黑 Microsoft YaHei
微軟正黑體 Microsoft JhengHei
新宋體 NSimSun
新細明體 PMingLiU
細明體 MingLiU
標楷體 DFKai-SB
仿宋 FangSong
楷體 KaiTi
仿宋_GB2312 FangSong_GB2312
楷體_GB2312 KaiTi_GB2312

參考資料:

  1. https://blog.csdn.net/u010758410/article/details/71743225

  2. https://blog.csdn.net/jenyzhang/article/details/52047557

  3. https://www.cnblogs.com/darkknightzh/p/6117528.html

  4. https://www.zhihu.com/question/49481680/answer/344653927


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM