文章目录
一、x,y坐标图1、基本操作2、进阶操作(1)解决中文乱码情况(2)调整图像大小(3)加标题、坐标文字、坐标轴标签(5)去掉上边框二、柱状图1、柱状图画图基本操作2、柱状图进阶操作3、SCI操作三、颜色与标记形状1、颜色表2、形状表又到了一年一度的论文级,大家是不是还在为怎么画图担忧呢,别担心,下载好Python软件,准备发车!!
一、x,y坐标图
1、基本操作
在使用Python画图之前,至少需要安装好matplotlib库,很简单,直接在终端:
pip install matplotlib
安装好之后,就可以进行简单画图了,用简单地二次函数举个例子。
y=x2{\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 pltx = np.range(1, 10)y = x**2plt.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') # 默认字体大小为10plt.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 pltimport numpy as npx = ['一', '二', '三']y = [23, 12, 45]# -----------------------------------------# 画图# -----------------------------------------plt.rcParams['font.sans-serif'] = ['SimHei'] # 如果要显示中文字体,则在此处设为:SimHeiplt.rcParams['axes.unicode_minus'] = False # 显示负号plt.bar(x, y)plt.show()
代码中的plt.bar()就是画柱状图所用的API
最终得到的结果如下图所示:在这里插入图片描述
2、柱状图进阶操作
在图形中画出一个柱子很简单,但是如果我们需要几个数据进行比较的话,就需要在一个x轴范围内画出两个柱子,这个情况下,我们就要引入
width
的概念了。
total_width, n = 0.8, 3width = total_width / n
我标的这个地方,就是width所在,如果想要在一个轴的地方画两个图,那么在代码中需要这样实现:
import matplotlib.pyplot as pltimport numpy as npx_b = ['一', '二', '三']x = np.linspace(0, 5, 3)y = [23, 12, 45]y2 = [44,19, 32]total_width, n = 0.8, 2width = total_width / n# -----------------------------------------# 画图# -----------------------------------------plt.rcParams['font.sans-serif'] = ['SimHei'] # 如果要显示中文字体,则在此处设为:SimHeiplt.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 jsonimport numpy as npimport matplotlib.pyplot as pltif __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"] = Falsedata_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:continueprint(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, 3width = total_width / nplt.rcParams['font.sans-serif'] = ['SimHei'] # 如果要显示中文字体,则在此处设为:SimHeiplt.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"] = Falseplt.savefig("./New__figure/各迭代次数所用时间.svg", dpi=300)plt.show()
代码中所用到的测试文件在百度网盘:
链接:/s/1UG-j_ZZR53egAzbfes86ww 提取码:lhpl
上述代码得到的效果如下所示:
把所有东西都加上去,看起来就很完美了。
三、颜色与标记形状
1、颜色表
2、形状表
平常能见到的颜色,这些基本上够用了。