matplotlib.pyplot绘制子图以及子图大小和位置的调整

今天为了把下面的8个子图的图形调的清晰加上大小合适,花费了大概5个多小时的时间,把这段代码记录下来,以防电脑上代码丢失,制图的大小,间距、位置,颜色怎么调整,看里面的注释。很简单的东西,把人能搞疯了。

等于说代码不算字,好吧,为了凑够二百字,我要拼命的努力打字了。其实有些时候明白了一个函数的参数的意思,很多东西都很好调,我这种半年没摸python的人,真的有些搞不动了。话说,差不多到200字了,我要结束絮叨了,今天不工作了,准备回去蒸红薯去。

"""
绘制pbft和VRF_TS_BFT在不同节点数不同概率下成功的对比图
"""

import numpy as np
import math
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from scipy.special import perm, comb
from matplotlib.pyplot import MultipleLocator

# print(comb(10, 2))
fig = plt.figure(figsize=(8, 28), dpi=70)#有时候子图的宽度和高度感觉差点的时候,这个时候就在这里调整画布的尺寸
# figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
# num:图像编号或名称,数字为编号 ,字符串为名称
# figsize:指定figure的宽和高,单位为英寸;
# dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 1英寸等于2.5cm,A4纸是 21*30cm的纸张
# facecolor:背景颜色
# edgecolor:边框颜色
# frameon:是否显示边框
gs = gridspec.GridSpec(nrows=4, ncols=2)
# nrows:它是一个整数,代表网格中的行数。
# ncols:它是一个整数,代表网格中的列数。
# figure:它是用于绘制图形的可选参数。
# left, right, top, bottom:这些是可选参数,用于将子图的范围定义为图形宽度或高度的一部分。
# wspase:这是一个可选的float参数,用于保留子图之间的宽度空间。
# hspace:它是一个可选的float参数,用于保留子图之间的高度空间。
# width_ratios:它是一个可选参数,代表列的宽度比率。
# height_ratios:它是一个可选参数,表示行的宽度比率。, height_ratios=[1, 1]
# gs.update(wspace = 0.1, hspace = 0.8)
p = np.arange(0, 1, 0.1)


# print(p) # 0到0.9


def getf1(n):
k = int((n - 1) / 3)
f1 = []
for j1 in range(0, 10):
sum = 0.0
for i1 in range(2 * k + 1, n + 1):
sum += comb(n, i1) * (p[j1] ** i1) * ((1 - p[j1]) ** (n - i1))
f1.append(sum)
return f1


def getf2(n):
k = int((n - 1) / 3)
f2 = []
for j2 in range(0, 10):
sum = 0.0
for i2 in range(k + 1, n + 1):
sum += comb(n, i2) * (p[j2] ** i2) * ((1 - p[j2]) ** (n - i2))
f2.append(sum)
return f2


f71 = getf1(7)
f72 = getf2(7)

f161 = getf1(16)
f162 = getf2(16)

f221 = getf1(22)
f222 = getf2(22)

f281 = getf1(28)
f282 = getf2(28)

f461 = getf1(46)
f462 = getf2(46)

f611 = getf1(61)
f612 = getf2(61)

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


# 前三个参数,nr表第几行,nbc表示所绘制图形所在列,参数都是从0开始计数
def PlotP(nr, nbc, x1, y1, x2, y2, title):
subplt = plt.subplot(gs[nr, nbc]) # 这个地方做了修改,这是要几行几列的,现在改为三行两列
# subplot(nrows,ncols,sharex,sharey,subplot_kw,**fig_kw)
subplt.plot(x1, y1, label='PBFT',color="gray") #
subplt.plot(x2, y2, label='VRF_TS_BFT', linestyle="--", color="black") #
subplt.set_title(title)
subplt.legend()


# Probability distribution of successful proposal
PlotP(0, 0, p, f71, p, f72, '(a) n = 7')
PlotP(0, 1, p, f161, p, f162, '(b) n = 16')
PlotP(1, 0, p, f221, p, f222, '(c) n = 22')
PlotP(1, 1, p, f281, p, f282, '(d) n = 28')
PlotP(2, 0, p, f461, p, f462, '(e) n = 46')
PlotP(2, 1, p, f611, p, f612, '(f) n = 61')

subplt1 = plt.subplot(gs[3,0])
subplt1.plot(p, f71, label='n=7', color=(0.3,0.3,0.3))
subplt1.plot(p, f161, label='n=16', linestyle="-.", color=(0.15,0.15,0.15))#虚点线
subplt1.plot(p, f221, label='n=22', linestyle="-", color=(0.75,0.75,0.75))#实线
subplt1.plot(p, f281, label='n=28', linestyle=":", color=(0.6,0.6,0.6))#点线
subplt1.plot(p, f461, label='n=46', linestyle="--", color=(0.45,0.45,0.45))#虚线
subplt1.plot(p, f611, label='n=61', linestyle="-", marker='|', color=(0,0,0))
subplt1.set_title("(g) PBFT")
subplt1.legend()

subplt2 = plt.subplot(gs[3,1])
subplt2.plot(p, f72, label='n=7', color=(0.3,0.3,0.3))
subplt2.plot(p, f162, label='n=16', linestyle="-.", color=(0.15,0.15,0.15))
subplt2.plot(p, f222, label='n=22', linestyle="-", color=(0.75,0.75,0.75))
subplt2.plot(p, f282, label='n=28', linestyle=":", color=(0.6,0.6,0.6))
subplt2.plot(p, f462, label='n=46', linestyle="--", color=(0.45,0.45,0.45))
subplt2.plot(p, f612, label='n=61', linestyle="-", marker='|', color=(0,0,0))
subplt2.set_title("(h) VRF_TS_BFT")
# plt.tight_layout()
subplt2.legend()
fig.subplots_adjust(wspace=0.2, hspace=0.3)# 这个是调整宽度距离和高度距离
# fig.tight_layout()
plt.savefig('D:\\22.png')
plt.show() 作者:任永旺 https://www.bilibili.com/read/cv14062166/ 出处:bilibili

posted @ 2022-08-14 14:13  南国之恋  阅读(2019)  评论(0编辑  收藏  举报