Python-matplotlib繪圖

一、前言

Matplotlib 是一個(gè) Python的 2D繪圖庫,它以各種硬拷貝格式和跨平臺(tái)的交互式環(huán)境生成出版質(zhì)量級(jí)別的圖形。

二、安裝

用pip命令安裝第三方庫
pip install matplotlib

三、小試牛刀(直線圖、折線圖)

先繪制個(gè)簡單的圖形,先導(dǎo)入pyplot模塊,然后定義點(diǎn)的坐標(biāo),再調(diào)用plot方法連線繪圖,然后設(shè)置圖形的屬性,最后保存和展示圖形。
PS:savefig()方法必須放在show()方法前。

from matplotlib import pyplot as plt  # 導(dǎo)入pyplot模塊

# 定義點(diǎn)的坐標(biāo),即x、y坐標(biāo)
x = range(10)
y1 = [i * 2 for i in x]
y2 = [i * 3 for i in x]
# 調(diào)用plot方法連線繪圖
plt.plot(x, y1, linewidth=1, color="orange", marker="o", label="hhhhhhhh")
plt.plot(x, y2, ":ro", label="ssssss")
plt.xlabel("angle")  # 設(shè)置x軸名稱
plt.ylabel("sine")  # 設(shè)置y軸名稱
# 設(shè)置橫縱坐標(biāo)
plt.xticks([0, 2, 4, 6, 8, 10, 12])
plt.yticks([0, 5, 10, 15, 20, 25])
plt.title('sine wave')  # 設(shè)置標(biāo)題
plt.grid()  # 設(shè)置網(wǎng)格模式
plt.legend(["xxxxx", "yyyyyy"], loc="upper left")  # 設(shè)置線條標(biāo)識(shí)
# 設(shè)置每個(gè)點(diǎn)上的數(shù)值
for i in range(10):
    plt.text(x[i], y2[i], y2[i], fontsize=12, color="black", style="italic", weight="light", verticalalignment='center',
             horizontalalignment='right', rotation=0)
plt.savefig('demo.jpg')  # 保存圖形,此方法必須放在show()前面,否則保存的是一個(gè)空白圖
# 使用show展示圖形
plt.show()

結(jié)果:

常用方法介紹

  • plt.plot(x, y, "格式控制字符串", 關(guān)鍵字=參數(shù))

    • x、y分別是橫縱坐標(biāo)。
    • 格式控制字符串最多可以包括三部分, "線型","顏色", "點(diǎn)型",。入?yún)㈨樞颍壕€型-》顏色-》點(diǎn)型
      線型:linestyle=['-','--','-.',':']
      顏色:color=['b','g','r','c','m','y','k','w']
      點(diǎn)型:marker=['.',',','o','v','^','<','>','1','2','3','4','s','p','*','h','H','+','x','D','d','|','_','.',',']
    • 關(guān)鍵字參數(shù),例如線條標(biāo)識(shí)label
      plot()設(shè)置的屬性會(huì)被legend()的覆蓋,legend()優(yōu)先級(jí)更高
  • plt.text(x, y, s, fontsize, verticalalignment,horizontalalignment,rotation , **kwargs)

    • x,y表示標(biāo)簽添加的位置,默認(rèn)是根據(jù)坐標(biāo)軸的數(shù)據(jù)來度量的,是絕對(duì)值,也就是說圖中點(diǎn)所在位置的對(duì)
      應(yīng)的值。
    • s表示標(biāo)簽的符號(hào),字符串格式。
    • fontsize顧名思義就是你加標(biāo)簽字體大小了,取整數(shù)。
    • verticalalignment表示垂直對(duì)齊方式 ,可選 ‘center’ ,‘top’ , ‘bottom’,‘baseline’ 等。
    • horizontalalignment表示水平對(duì)齊方式 ,可以填 ‘center’ , ‘right’ ,‘left’ 等。
    • rotation表示標(biāo)簽的旋轉(zhuǎn)角度,以逆時(shí)針計(jì)算,取整。
    • 后面還有 family 用來設(shè)置字體,style 設(shè)置字體的風(fēng)格,weight 字體的粗細(xì), bbox 給字體添加框,如
      bbox=dict(facecolor=‘red’, alpha=0.5) 等,各種風(fēng)格,應(yīng)有盡有,總有一款適合你。
  • pyplot.legend(handles,labels,loc) 參考傳送門
    handles需要傳入你所畫線條的實(shí)例對(duì)象,即調(diào)用plt.plot()返回的對(duì)象。
    labels是圖例的名稱(能夠覆蓋在plt.plot( )中l(wèi)abel參數(shù)值)。
    loc代表了圖例在整個(gè)坐標(biāo)軸平面中的位置(一般選取'best'這個(gè)參數(shù)值)。supported values are 'best', 'upper right', 'upper left', 'lower left', 'lower right', 'right', 'center left', 'center right', 'lower center', 'upper center', 'center'

    # 用法一,直接在legend()定義label
    line1, = plt.plot(n, m1, color='r', linewidth=1.5, linestyle='-')
    line2, = plt.plot(n, m2, 'b')
    plt.legend(handles=[line1, line2], labels=['girl購物欲望','boy購物欲望'], loc='best')
    plt.legend(labels=['girl購物欲望','boy購物欲望'], loc='best')  # 這樣寫也OK,默認(rèn)一一對(duì)應(yīng)
    # 用法二
    plt.plot(n, m1, color='r', linewidth=1.5, linestyle='-', label='女生購物欲望')  # 給plt.plot( )中參數(shù)label=''傳入字符串類型的值,也就是圖例的名稱
    plt.plot(n, m2, 'b', label='男生購物欲望')  # 使用plt.legend( )使上述代碼產(chǎn)生效果
    plt.legend()
    

四、餅圖

plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1,
        startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False,
        rotatelabels=False, hold=None, data=None)

pie 函數(shù)參數(shù)詳解

  • x :(每一塊)的比例,如果sum(x) >1會(huì)使用sum(x)歸一化;
  • labels :(每一塊)餅圖外側(cè)顯示的說明文字;
  • explode :(每一塊)離開中心距離;
  • startangle :起始繪制角度,默認(rèn)圖是從x軸正方向逆時(shí)針畫起,如設(shè)定=90則從y軸正方向畫起;
  • shadow :在餅圖下面畫一個(gè)陰影。默認(rèn)值:False,即不畫陰影;
  • labeldistance :label標(biāo)記的繪制位置,相對(duì)于半徑的比例,默認(rèn)值為1.1, 如<1則繪制在餅圖內(nèi)側(cè);
  • autopct :控制餅圖內(nèi)百分比設(shè)置,可以使用format字符串或者format function'%1.1f'指小數(shù)點(diǎn)前后位數(shù)(沒有用空格補(bǔ)齊);
  • pctdistance :類似于labeldistance,指定autopct的位置刻度,默認(rèn)值為0.6;
  • radius :控制餅圖半徑,默認(rèn)值為1;counterclock:指定指針方向;布爾值,可選參數(shù),默認(rèn)為:True,即逆時(shí)針。將值改為False即可改為順時(shí)針。
  • wedgeprops:字典類型,可選參數(shù),默認(rèn)值:None。參數(shù)字典傳遞給wedge對(duì)象用來畫一個(gè)餅圖。例如:* * wedgeprops={'linewidth':3}設(shè)置wedge線寬為3。
  • textprops:設(shè)置標(biāo)簽(labels)和比例文字的格式;字典類型,可選參數(shù),默認(rèn)值為:None。傳遞給text對(duì)象的字典參數(shù)。
  • center:浮點(diǎn)類型的列表,可選參數(shù),默認(rèn)值:(0,0)。圖標(biāo)中心位置。
  • frame:布爾類型,可選參數(shù),默認(rèn)值:False。如果是true,繪制帶有表的軸框架。
  • rotatelabels:布爾類型,可選參數(shù),默認(rèn)為:False。如果為True,旋轉(zhuǎn)每個(gè)label到指定的角度。
import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]  # 設(shè)置字體
plt.style.use('fivethirtyeight')
languages = ['JavaScript', 'HTML/CSS', 'SQL', 'Python', 'Java']
popularity = [59219, 55466, 47544, 36443, 35917]

plt.pie(popularity, labels=languages, autopct='%1.1f%%',
        counterclock=False, startangle=90, explode=[0, 0.2, 0, 0, 0])

plt.title('top5 編程語言占比')
plt.tight_layout()  # 自動(dòng)調(diào)整子圖的尺寸使充滿整個(gè)figure
plt.show()

五、柱狀圖

import matplotlib.pyplot as plt
import random

# 解決中文亂碼問題
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.rcParams["axes.unicode_minus"] = False

# 定義x軸、y軸數(shù)據(jù)
x_data = ["20{}年".format(i) for i in range(16, 22)]
y_data = [random.randint(100, 300) for i in range(6)]

# 繪圖
for i in range(len(x_data)):  # 編寫渲染使柱狀圖顏色不同
    plt.bar(x_data[i], y_data[i])

# 添加數(shù)據(jù)標(biāo)簽
for i in range(len(x_data)):
    plt.text(x_data[i], y_data[i], y_data[i])

plt.title("銷量分析")
plt.xlabel("年份")
plt.ylabel("銷量")
plt.show()

plt.bar(x,height,[width=0.8][,align='center'][,color='blue'])

  • x:表示x坐標(biāo)的取值.
  • height:條形圖每個(gè)條形的高度,即y坐標(biāo)的取值。
  • width:條形圖每個(gè)條形的寬度,取值為0~1,默認(rèn)為0.8。
  • align:將條形與x坐標(biāo)對(duì)齊的方式,align='center'表示將條形底邊中心置于x坐標(biāo)的位置,align='edge'表示將條形的左邊緣與x坐標(biāo)位置對(duì)齊。
  • color:條形的顏色,默認(rèn)為'blue'


并列柱狀圖

# 導(dǎo)入擴(kuò)展包
import matplotlib.pyplot as plt
import numpy as np

# 構(gòu)造數(shù)據(jù)
y1 = [1, 4, 6, 8, 9, 4, 3, 8]
y2 = [2, 5, 9, 5, 3, 2, 7, 4]
x = np.arange(len(y1))

# 設(shè)置柱狀圖的寬度
width = 0.4

# 繪圖
plt.figure(figsize=(8, 4))

plt.bar(x=x, height=y1, width=width, label='Data1')
plt.bar(x=x + width, height=y2, width=width, label='Data2')

# 添加數(shù)據(jù)標(biāo)簽
for x_value, y_value in zip(x, y1):
    plt.text(x=x_value, y=y_value, s=y_value)

for x_value, y_value in zip(x, y2):
    plt.text(x=x_value + width, y=y_value, s=y_value)

# 添加圖標(biāo)題和圖例
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
plt.title('并列柱狀圖')
plt.legend()
plt.show()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 3種繪圖 pandas 和 seaborn 繪圖都是基于 matplotlib的 變化趨勢(shì)用線性圖,對(duì)應(yīng)關(guān)系...
    藍(lán)天下悠閑的云朵閱讀 1,173評(píng)論 0 0
  • import matplotlib.pyplot as plt figure.savefig的選項(xiàng) filenam...
    萌木蓋閱讀 866評(píng)論 0 1
  • 本文要講的是Matplotlib,一個(gè)強(qiáng)大的Python可視化庫。通過模塊,輕松實(shí)現(xiàn)曲線圖、散點(diǎn)圖、折線圖、直方圖...
    SlashBoyMr_wang閱讀 2,138評(píng)論 0 2
  • Matplotlib是Python中用的最多的2D圖形繪圖庫,學(xué)好Matplotlib的用法可以幫助我們?cè)诮y(tǒng)計(jì)分析...
    BubbleL閱讀 8,540評(píng)論 0 12
  • 1.直接生成圖表 plt.show() 2.魔法函數(shù) 3.可交互的matplotlib窗口 彈出控制臺(tái) 圖例位置 ...
    賀晴天閱讀 547評(píng)論 0 0

友情鏈接更多精彩內(nèi)容