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

前言

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

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

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



安裝

pip安裝

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

pip3 install matplotlib

安裝包安裝

若是你的Python3能夠直接點擊下面的py3連接下載進行安裝,則點擊能夠點擊其餘python版本下載對應Python版本進行安裝
matplotlib-1.4.3.win-amd64-py3windows

其餘python版本api

柱狀圖

主要方法

用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繪製圖像顯示中文時,中文會變成小方格子。搜了不少資料,最佳的解決方法是動態設置參數,添加下面的代碼。dom

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. http://www.javashuo.com/article/p-qzmrbyka-ne.html

  2. http://www.javashuo.com/article/p-xglrmfby-d.html

  3. http://www.javashuo.com/article/p-ujlkirno-ev.html

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

相關文章
相關標籤/搜索