16、17、18_使用gridspec定义多子图,条形图(Bar plots),分组条形图,堆叠条形图(Stacked bar chart),饼图(Pie plots),甜甜圈图,嵌套饼图
16.使用gridspec定義多子圖
16.1.圖標題
17.條形圖(Bar plots)
17.1.分組條形圖
17.2.堆疊條形圖(Stacked bar chart)
18.餅圖(Pie plots)
18.1.甜甜圈圖(Donut chart)
18.2.嵌套餅圖 (Nested pie chart)
16.使用gridspec定義多子圖
matplotlib.gridspec包含一個GridSpec類。它可以替代subplot來指定要創建的子圖的幾何布局。GridSpec背后的基本思路是”grid”。一個grid(網格)有多個行和列。必須在此之后定義個subplot應該跨越多少網格。
以下示例顯示了最簡單的情況,即1 * 1 grid。
import matplotlib.pyplot as plt from matplotlib.pyplot import GridSpec fig = plt.figure() gs = GridSpec(1, 1) ax = fig.add_subplot(gs[0, 0]) plt.show()我們可以使用Gridspec的某些參數,例如, 可以定義圖形從可用figure區域的底部的20%、左側的15%開始:
import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec fig = plt.figure() gs = GridSpec(1, 1,bottom=0.2,left=0.15,top=0.8)ax = fig.add_subplot(gs[0,0]) plt.show()下一個示例顯示了一個更復雜的示例,其網絡設計更加精細:
pyplot.figure用到的參數:
figsize(float, float), optional,default: None
width, height in inches. If not provided, defaults to rcParams[“figure.figsize”] (default: [6.4, 4.8]) = [6.4, 4.8].
import matplotlib.gridspec as gridspec import matplotlib.pyplot as pl pl.figure(figsize=(6, 4)) G = gridspec.GridSpec(3, 3) axes_1 = pl.subplot(G[0, :]) pl.xticks(()) pl.yticks(()) pl.text(0.5, 0.5, 'Axes 1', ha='center', va='center', size=24, alpha=.5) axes_2 = pl.subplot(G[1, :-1]) pl.xticks(()) pl.yticks(()) pl.text(0.5, 0.5, 'Axes 2', ha='center', va='center', size=24, alpha=.5) axes_3 = pl.subplot(G[1:, -1]) pl.xticks(()) pl.yticks(()) pl.text(0.5, 0.5, 'Axes 3', ha='center', va='center', size=24, alpha=.5) axes_4 = pl.subplot(G[-1, 0]) pl.xticks(()) pl.yticks(()) pl.text(0.5, 0.5, 'Axes 4', ha='center', va='center', size=24, alpha=.5) axes_5 = pl.subplot(G[-1, -2]) pl.xticks(()) pl.yticks(()) pl.text(0.5, 0.5, 'Axes 5', ha='center', va='center', size=24, alpha=.5) pl.tight_layout() pl.show()現在,我們使用上一個示例中的grid specification(網格規范),以一些函數的圖形填充它:
import matplotlib.gridspec as gridspec import matplotlib.pyplot as plt import numpy as np plt.figure(figsize=(6, 4)) G = gridspec.GridSpec(3, 3) X = np.linspace(0, 2 * np.pi, 50, endpoint=True) F1 = 2.8 * np.cos(X) F2 = 5 * np.sin(X) F3 = 0.3 * np.sin(X) axes_1 = plt.subplot(G[0, :]) axes_1.plot(X, F1, 'r-', X, F2) axes_2 = plt.subplot(G[1, :-1]) axes_2.plot(X, F3) axes_3 = plt.subplot(G[1:, -1]) axes_3.plot([1,2,3,4], [1,10,100,1000], 'b-') axes_4 = plt.subplot(G[-1, 0]) axes_4.plot([1,2,3,4], [47, 11, 42, 60], 'r-') axes_5 = plt.subplot(G[-1, -2]) axes_5.plot([1,2,3,4], [7, 5, 4, 3.8]) plt.tight_layout() plt.show()16.1.圖標題
創建具有單獨的subplot標題和居中figure標題的figure。
import matplotlib.pyplot as plt import numpy as npdef f(t):s1 = np.cos(2 * np.pi * t)e1 = np.exp(-t)return s1 * e1t1 = np.arange(0.0, 5.0, 0.1) t2 = np.arange(0.0, 5.0, 0.02) t3 = np.arange(0.0, 2.0, 0.01)fig, axs = plt.subplots(2, 1, constrained_layout=True) axs[0].plot(t1, f(t1), 'o', t2, f(t2), '-') axs[0].set_title('subplot 1') axs[0].set_xlabel('distance (m)') axs[0].set_ylabel('Damped oscillation') fig.suptitle('This is a somewhat long figure title', fontsize=16)axs[1].plot(t3, np.cos(2 * np.pi * t3), '--') axs[1].set_xlabel('time (s)') axs[1].set_title('subplot 2') axs[1].set_ylabel('Undamped')plt.show()17.條形圖(Bar plots)
條形圖是用矩形條形顯示分類數據,其高度或長度與其所代表的值成正比。
條形圖可以垂直或水平繪制。
適用時機:
?比較分類數據
?離散類別之間的比較
?圖表的一個軸顯示要比較的特定類別,另一個軸代表測量值。
pyplot.bar定義文檔:plot.bar
import matplotlib.pyplot as pltbars = plt.bar([1, 2, 3, 4], [1, 4, 9, 16]) bars[0].set_color('green')plt.show() import matplotlib.pyplot as pltf = plt.figure() ax = f.add_subplot(1, 1, 1) ax.bar([1, 2, 3, 4], [1, 4, 9, 16]) children = ax.get_children() children[3].set_color('g')plt.show() import matplotlib.pyplot as plt import numpy as np years = ('2015', '2016', '2017', '2018', '2019') visitors = (1241, 50927, 162242, 222093, 296665 / 8 * 12) index = np.arange(len(visitors)) bar_width = 1.0 plt.bar(index, visitors, bar_width, color="green") plt.xticks(index + bar_width / 2, years) # labels get centered plt.show()17.1.分組條形圖
條形圖還可以用于分組條形圖和堆疊條形圖的更復雜的數據比較。 在分組的條形圖中,對于每個類別組,都有兩個或多個條形。 這些條用不同的顏色表示特定的分組。
import matplotlib.pyplot as plt import numpy as nplabels = ['G1', 'G2', 'G3', 'G4', 'G5'] men_means = [20, 34, 30, 35, 27] women_means = [25, 32, 34, 20, 25]x = np.arange(len(labels)) # the label locations width = 0.35 # the width of the barsfig, ax = plt.subplots() rects1 = ax.bar(x - width / 2, men_means, width, label='Men') rects2 = ax.bar(x + width / 2, women_means, width, label='Women')# Add some text for labels, title and custom x-axis tick labels, etc. ax.set_ylabel('Scores') ax.set_title('Scores by group and gender') ax.set_xticks(x) ax.set_xticklabels(labels) ax.legend()def autolabel(rects):"""Attach a text label above each bar in *rects*, displaying its height."""for rect in rects:height = rect.get_height()ax.annotate('{}'.format(height),xy=(rect.get_x() + rect.get_width() / 2, height),xytext=(0, 3), # 3 points vertical offsettextcoords="offset points",ha='center', va='bottom')autolabel(rects1) autolabel(rects2)fig.tight_layout()plt.show()17.2.堆疊條形圖(Stacked bar chart)
堆疊的條形圖將代表不同組的條形圖堆疊在一起。 條的高度顯示了這些組的組合結果。
適用時機:
?比較總數(total)和總數的一部分。
?如果組成部分的總數(total)至關重要,則堆疊的柱形圖可以很好地適用。
下面是使用bar創建帶有誤差線的堆疊條形圖的示例。 請注意用于誤差線的參數yerr,并在底部將Women條堆疊在Men條的頂部。
import matplotlib.pyplot as pltlabels = ['G1', 'G2', 'G3', 'G4', 'G5'] men_means = [20, 35, 30, 35, 27] women_means = [25, 32, 34, 20, 25] men_std = [2, 3, 4, 1, 2] women_std = [3, 5, 2, 3, 3] width = 0.35 # the width of the bars: can also be len(x) sequencefig, ax = plt.subplots()ax.bar(labels, men_means, width, yerr=men_std, label='Men') ax.bar(labels, women_means, width, yerr=women_std, bottom=men_means,label='Women')ax.set_ylabel('Scores') ax.set_title('Scores by group and gender') ax.legend()plt.show()18.餅圖(Pie plots)
餅圖是圓形統計圖形,將其分成多個切片以說明數字比例。 在餅圖中,每個切片的弧長(以及其中心角和面積)均與其表示的量成比例。
適用時機:
?顯示百分比或比例數據
?顯示分類數據
?使用正值
下面演示基本的餅圖,還顯示了一些可選功能:
?切片標簽
?自動標記百分比
?用”爆炸”偏移切片
?陰影
?自定義起始角度
關于自定義起始角度的注意事項:默認起始角度為0,它將在正x軸上開始"Frogs"切片。 本示例將startangle = 90設置為使所有內容都逆時針旋轉90度,并且"Frogs"切片從y軸正方向開始。
import matplotlib.pyplot as plt# Pie chart, where the slices will be ordered and plotted counter-clockwise: labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' sizes = [15, 30, 45, 10] explode = (0, 0.1, 0, 0) # only "explode" the 2nd slice (i.e. 'Hogs')fig1, ax1 = plt.subplots() ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',shadow=True, startangle=90) ax1.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.plt.show()
參數說明:
?x :(每一塊)的比例,如果sum(x) > 1會使用sum(x)歸一化;
?labels :(每一塊)餅圖外側顯示的說明文字;
?explode :(每一塊)離開中心距離;
?startangle :起始繪制角度,默認圖是從x軸正方向逆時針畫起,如設定=90則從y軸正方向畫起;
?shadow :在餅圖下面畫一個陰影。默認值:False,即不畫陰影;
?labeldistance :label標記的繪制位置,相對于半徑的比例,默認值為1.1, 如<1則繪制在餅圖內側;
?autopct :控制餅圖內百分比設置,可以使用format字符串或者format function;’%1.1f’指小數點前后位數(沒有用空格補齊);
?pctdistance :類似于labeldistance,指定autopct的位置刻度,默認值為0.6;
?radius :控制餅圖半徑,默認值為1;counterclock :指定指針方向;布爾值,可選參數,默認為:True,即逆時針。將值改為False即可改為順時針。
?wedgeprops :字典類型,可選參數,默認值:None。參數字典傳遞給wedge對象用來畫一個餅圖。例如:wedgeprops={‘linewidth’:3}設置wedge線寬為3。
?textprops :設置標簽(labels)和比例文字的格式;字典類型,可選參數,默認值為:None。傳遞給text對象的字典參數。
?center :浮點類型的列表,可選參數,默認值:(0,0)。圖標中心位置。
?frame :布爾類型,可選參數,默認值:False。如果是true,繪制帶有表的軸框架。
?rotatelabels :布爾類型,可選參數,默認為:False。如果為True,旋轉每個label到指定的角度。
此餅圖描述了每種水果的營業百分比。蘋果銷售是7個水果中營業額最高的,占營業額的32%。
18.1.甜甜圈圖(Donut chart)
甜甜圈圖是餅圖的一種變體,中間有一個空白的中心,允許包含有關整個數據的其他信息。
import matplotlib.pyplot as pltlabels = 'apple', 'banana', 'cherry', 'durian', 'elderberries', 'figs', 'grapes' sizes = [32, 20, 15, 10, 10, 8, 5]my_circle = plt.Circle((0, 0), 0.7, color='white') d = plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90, labeldistance=1.05)plt.axis('equal') plt.gca().add_artist(my_circle)plt.show()18.2.嵌套餅圖 (Nested pie chart)
嵌套餅圖或多級餅圖可讓你將多個級別或層包含到餅圖中。
適用時機:
?在合并的餅狀結構中顯示對稱和不對稱的樹結構。
?多層數據表示,例如關鍵字分析
?相互關聯的樹數據,例如,朋友的朋友
總結
以上是生活随笔為你收集整理的16、17、18_使用gridspec定义多子图,条形图(Bar plots),分组条形图,堆叠条形图(Stacked bar chart),饼图(Pie plots),甜甜圈图,嵌套饼图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 15_多子图-Subplot、Subpl
- 下一篇: 特斯拉自动驾驶跟挡风玻璃有关吗?