• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Python-matplotlib画图要点大

武飞扬头像
风栖柳白杨
帮助1


又到了一年一度的论文级,大家是不是还在为怎么画图担忧呢,别担心,下载好Python软件,准备发车!!

一、x,y坐标图

1、基本操作

   在使用Python画图之前,至少需要安装好matplotlib库,很简单,直接在终端:

pip install matplotlib

 安装好之后,就可以进行简单画图了,用简单地二次函数举个例子。
y    =    x 2 {\rm{y}}\;{\rm{ = }}\;{x^2} % MathType!MTEF!2!1! - % feaahqart1ev3aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLn % hiov2DGi1BTfMBaeXatLxBI9gBaerbd9wDYLwzYbItLDharqqtubsr % 4rNCHbWexLMBbXgBd9gzLbvyNv2CaeHbl7mZLdGeaGqiVu0Je9sqqr % pepC0xbbL8F4rqqrFfpeea0xe9Lq-Jc9vqaqpepm0xbba9pwe9Q8fs % 0-yqaqpepae9pg0FirpepeKkFr0xfr-xfr-xb9adbaqaaeGaciGaai % aabeqaamaabaabauaakeaacaqG5bGaaGjbVlaab2dacaaMe8UaamiE % amaaCaaaleqabaGaaGOmaaaaaaa!45DA! y=x2
 那么在画这条曲线之前,需要确定一下x和y的范围和取值,比如x的取值从0~9,那么在代码中可以这样表示:

x = np.arange(0,10)
y = x**2

 有了取值就可以画图了,直接用下面的代码进行最简单的画图:

import matplotlib.plot as plt
x = np.range(1, 10)
y = x**2				
plt.plot(x, y)			# 画图函数
plt.show()				# 用于显示所画的图形
# plt.savfig("demo.svg", dpi=300)

 使用plt.show()函数可以显示所画图形,使用plt.savfig("demo.svg", dpi=300)可以将所画的图形保存下来,这里的svg格式是论文中的常用格式,后面的dpi表示图像的清晰度,这里一般设置为300或者500就够了,设置的太高的话,电脑很有可能死机,或者图像打不开。(电脑性能不好,最好不要设置到1000以上)

2、进阶操作

(1)解决中文乱码情况

 如果在画图的过程中,遇到无法正常显示中文的情况,在画图前加上这两句代码:

plt.rcParams['font.sans-serif'] = ['SimHei'] 	# 显示中文字体
plt.rcParams['axes.unicode_minus'] = False  	# 显示负号

(2)调整图像大小

 想要调整图像大小的话,可以在画图代码的最前边,加上这样一句代码:

plt.figure(figsize=(10, 5))		

学新通
 这里取决于自己,如果是电力电子相关专业的话,可以将图像适当拉长,看起来会比较好看。

(3)加标题、坐标文字、坐标轴标签

plt.title("标题", fontsize=25)
plt.xticks(fontsize=15, fontweight='bold')  			# 默认字体大小为10
plt.yticks(fontsize=15, fontweight='bold')
plt.xlabel('x轴标签', fontsize=25, fontweight='bold')
plt.ylabel('y轴标签', fontsize=25, fontweight='bold')

加上这些东西之后,效果图如下所示(可以与上面的图像比较一下):
学新通
 如果一张图中出现不止一条曲线,也可以加上legend,

plt.plot(x, y, label="二次函数")
plt.legend(loc=0, numpoints=1)
leg = plt.gca().get_legend()
ltext = leg.get_texts()
plt.setp(ltext, fontsize=12, fontweight='bold')                     # 设置图例字体的大小和粗细
plt.grid(linestyle="--")  # 设置背景网格线为虚线

 加上这一段之后,得到的效果图如下所示:
学新通
 如果嫌弃字太大,自行设置即可。

(5)去掉上边框

如果不想要上边框和有边框,加上如下代码:

ax = plt.gca()
ax.spines['top'].set_visible(False)  # 去掉上边框
ax.spines['right'].set_visible(False)  # 去掉右边框

效果如下所示:
学新通
是不是有SCI论文里边那种感觉了。

二、柱状图

1、柱状图画图基本操作

首先来看一个比较简单的代码示例:

import matplotlib.pyplot as plt
import numpy as np
x = ['一', '二', '三']
y = [23, 12, 45]
# -----------------------------------------
#   画图
# -----------------------------------------
plt.rcParams['font.sans-serif'] = ['SimHei']  # 如果要显示中文字体,则在此处设为:SimHei
plt.rcParams['axes.unicode_minus'] = False  # 显示负号
plt.bar(x, y)
plt.show()
代码中的plt.bar()就是画柱状图所用的API

最终得到的结果如下图所示:在这里插入图片描述
学新通

2、柱状图进阶操作

在图形中画出一个柱子很简单,但是如果我们需要几个数据进行比较的话,就需要在一个x轴范围内画出两个柱子,这个情况下,我们就要引入width的概念了。

total_width, n = 0.8, 3
width = total_width / n

学新通
我标的这个地方,就是width所在,如果想要在一个轴的地方画两个图,那么在代码中需要这样实现:

import matplotlib.pyplot as plt
import numpy as np
x_b = ['一', '二', '三']
x = np.linspace(0, 5, 3)
y = [23, 12, 45]
y2 = [44,19, 32]
total_width, n = 0.8, 2
width = total_width / n
# -----------------------------------------
#   画图
# -----------------------------------------
plt.rcParams['font.sans-serif'] = ['SimHei']  # 如果要显示中文字体,则在此处设为:SimHei
plt.rcParams['axes.unicode_minus'] = False  # 显示负号
plt.bar(x-width, y)
plt.bar(x width, y2)
plt.xticks(np.array(x), x_b, fontweight='bold', fontsize=20)
plt.show()

在柱状图中,一般把一个柱子当成total_width,那么需要画几个柱子,只需要调节n参数就行。
学新通
那么红色的柱子x轴的定位点应该是x-width,绿色柱子x轴的定位点应该是x width
上述代码中得到的效果图如下所示:
学新通

3、SCI操作

把上面的一些骚操作都结合起来,就可以画一个比较漂亮的图了,比如在我的硕士论文中,画了一个这样的图,我把代码全都贴出来:

'''
    函数目的:
        画图
    横轴为 epoch
    纵轴是 time_every
'''
import json

import numpy as np
import matplotlib.pyplot as plt
if __name__ == '__main__':

    with open("./resnet50/time_epoch.json", "r") as f:
        time_resnet50 = json.load(f)
    with open("./resnet101_ibn/time_epoch.json", "r") as f:
        time_resnet101_ibn = json.load(f)
    with open("./resnet101_ibn_cos/time_epoch.json", "r") as f:
        time_resnet101_ibn_cos = json.load(f)
    epoch = range(0, 60)
    plt.rcParams["font.sans-serif"] = ['SimHei']
    plt.rcParams["axes.unicode_minus"] = False

    data_time_resnet50 = []
    data_time_resnet101_ibn = []
    data_time_resnet101_ibn_cos = []
    data_epoch = []
    for i in range(0, 61):
        try:
            if i % 5 == 0:
                data_time_resnet50.append(time_resnet50[i])
                data_time_resnet101_ibn.append(time_resnet101_ibn[i])
                data_time_resnet101_ibn_cos.append(time_resnet101_ibn_cos[i])
                data_epoch.append(i)
        except:
            continue

    print(len(data_epoch))
    print(len(data_time_resnet50))
    print(len(data_time_resnet101_ibn))
    print(len(data_time_resnet101_ibn_cos))
    print(data_epoch)
    x_1 = np.linspace(0, 10, len(data_epoch))
    x = np.linspace(0, 55, len(data_epoch))
    x_t = [str(int(x)) for x in x]
    print(x_t)
    total_width, n = 0.8, 3
    width = total_width / n

    plt.rcParams['font.sans-serif'] = ['SimHei']  # 如果要显示中文字体,则在此处设为:SimHei
    plt.rcParams['axes.unicode_minus'] = False  # 显示负号
    plt.figure(figsize=(16, 9))
    ax = plt.gca()
    ax.spines['top'].set_visible(False)  # 去掉上边框
    ax.spines['right'].set_visible(False)  # 去掉右边框
    plt.grid(linestyle="--")  # 设置背景网格线为虚线
    plt.bar(x_1-width/2, data_time_resnet50, width=width, label="ResNet50", color="red")
    plt.bar(x_1 width/2, data_time_resnet101_ibn, width=width, label="ResNet101", color="green")
    plt.bar(x_1 3*width/2, data_time_resnet101_ibn_cos, width=width, label="L-ResNet101", color="blue")
    plt.xticks(np.array(x_1) width/2, x_t, fontweight='bold', fontsize=20)
    plt.yticks(fontsize=20, fontweight='bold')
    # ------------------------------------
    #   设置图例
    # ------------------------------------
    plt.legend(loc=0, numpoints=1)
    leg = plt.gca().get_legend()
    ltext = leg.get_texts()
    plt.setp(ltext, fontsize=20, fontweight='bold')  # 设置图例字体的大小和粗细
	# ------------------------------------
    #   设置x,y轴
    # ------------------------------------
    plt.xlabel("Epoch",fontsize=25, fontweight='bold')
    plt.ylabel('Time/minues', fontsize=25, fontweight='bold')
    plt.rcParams["font.sans-serif"] = ['SimHei']
    plt.rcParams["axes.unicode_minus"] = False
    plt.savefig("./New_2022_figure/各迭代次数所用时间.svg", dpi=300)
    plt.show()

代码中所用到的测试文件在百度网盘:

链接:https://pan.百度.com/s/1UG-j_ZZR53egAzbfes86ww 
提取码:lhpl

上述代码得到的效果如下所示:
学新通
 把所有东西都加上去,看起来就很完美了。

三、颜色与标记形状

1、颜色表

学新通

2、形状表

学新通

平常能见到的颜色,这些基本上够用了。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfgagh
系列文章
更多 icon
同类精品
更多 icon
继续加载