1.安装matplotlib
matplotlib是一个非常实用的画柱状图的tool,通过pip install matplotlib直接安装即可
2.具体代码
import matplotlib.pyplot as plt
import inspect
yolov4_time,yolo_time,ssdface_time, libface_time=0.1,0.5,0.3,0.2
waste_times = (yolov4_time,yolo_time,ssdface_time, libface_time)
labels = []
def retrieve_name(var):
callers_local_vars = inspect.currentframe().f_back.f_locals.items()
return [var_name for var_name, var_val in callers_local_vars if var_val is var]
for data in waste_times:
labels.append(retrieve_name(data)[0].replace('_time', ''))
plt.rcParams['font.family'] = 'SimHei' # 设置中文解决matplotlib中文乱码问题
x = list(range(len(waste_times)))
plt.bar(x, waste_times, width=0.5, color='red', label='耗时比较', tick_label=labels)
for a, b in zip(x, waste_times):
plt.text(a, b, '%.1f' % b, ha='center', va='bottom', fontsize=10) # 添加数据标签
plt.xlabel("模型")
plt.ylabel("时间")
plt.legend()
plt.show()
运行结果:
3.绘制多条柱状图
代码:
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] #指定默认字体 SimHei为黑体
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负
Log_015 = np.array([0.039, 0.048, 0.951])
Log_043 = np.array([0.012, 0.014, 0.997])
Les_015 = np.array([0.031, 0.045, 0.963])
Les_043 = np.array([0.028, 0.031, 0.983])
name_list = ['MAE', 'RMSE', 'R2']
x = list(range(len(name_list))) #横坐标的名
width = 0.2 #直方图的柱宽
colors = ['b','g'] #直方图的颜色
plt.figure(figsize=(8,6)) #
plt.ylim([0,1]) #纵坐标的范围,横坐标的话改成xlim
plt.grid(zorder=0,alpha=0.4) #图层在最底下,网格的透明度
# plt.ylabel("Accuracy(%)") #纵轴标签
plt.xlabel("不同评价指标") #横轴标签
plt.bar(x,Log_015,width=width,label='Log_015',tick_label = name_list,fc='y',zorder=10,edgecolor='black')
#x表示横坐标,multi_unrevoke是纵坐标的值,width是柱宽,label是图例代表这个柱表示什么,tick_label是横坐标对应的标签,fc是颜色,zorder设置的比网格大,代表柱状图在网格之上不会被网格遮盖,edgecolor表示的柱状图边长的颜色,设置为黑色描个边
for i in range(len(x)):
x[i] = x[i]+width+0.05 #这里设置的是第二个柱对应的横坐标,因为这里想让两个柱状图之间有点空隙,就让横坐标右移了一些
plt.bar(x,Log_043,width=width,label="Log_043",tick_label = name_list,fc='r',zorder=10,edgecolor='black')
for i in range(len(x)):
x[i] = x[i]+width+0.05 #这里设置的是第三个柱对应的横坐标,因为这里想让两个柱状图之间有点空隙,就让横坐标右移了一些
plt.bar(x,Les_015,width=width,label="Les_015",tick_label = name_list,fc='b',zorder=10,edgecolor='black')
for i in range(len(x)):
x[i] = x[i]+width+0.05 #这里设置的是第三个柱对应的横坐标,因为这里想让两个柱状图之间有点空隙,就让横坐标右移了一些
plt.bar(x,Les_043,width=width,label="Les_043",tick_label = name_list,fc='g',zorder=10,edgecolor='black')
xx = [1,2,3]
plt.xticks([index -0.6 for index in xx], name_list, rotation='horizontal') #这里是因为x轴的标签不太居中,所以在这里通过index设置一下看能不能居中,rotation是标签的方向,也可以设置成垂直之类的
# plt.xticks([index -0.875 for index in xx], name_list, rotation='horizontal') #这里是因为x轴的标签不太居中,所以在这里通过index设置一下看能不能居中,rotation是标签的方向,也可以设置成垂直之类的
plt.legend()
# plt.title("Accuracy of Different Datasets without Revoking Requests",fontsize=14)
plt.show()
结果图: