python绘图技巧汇总

matplotlib字体查询及设置

* 需求:想要中文字体,但不同系统的字体库有所不同,需要查出有哪些字体,并挑出自己想要的

查询当前系统所有字体并查看

from matplotlib.font_manager import FontManager
import matplotlib.pyplot as plt
import matplotlib as mpl
import subprocess
mpl_fonts = set(f.name for f in FontManager().ttflist)
print('all font list get from matplotlib.font_manager:')
for f in sorted(mpl_fonts):
	mpl.rcParams['font.family'] = f # 字体设置方法,应用全局
    plt.plot([1,2],[1,2]) # 打印效果,这样就能找到中文字体了
    plt.xlabel('中文字体')
    print('\t' + f)

matplotlib坐标轴刻度显示为百分数

只需要在plt.show()之前加上这三行

from matplotlib.ticker import FuncFormatter
def to_percent(temp, position):
      return '%1.2f'%(100*temp) + '%' # 这是显示格式,可根据需要调整
plt.gca().yaxis.set_major_formatter(FuncFormatter(to_percent))

ref:https://www.qb5200.com/article/389707.html

图片样式相关设置

  1. 图片长宽设置:plt.figure(figsiz=(10,5)),其中10为宽度(横向)、5为高度(纵向);
  2. x轴刻度值更改:plt.xticks(ticks=x_val, labels = tag_val),需求背景:当x轴刻度为类别变量时,需要将数字改为字符,其中x_val指明了原本的数值刻度,而tag_val为替换后字符,两者均为List;
  3. x轴刻度旋转:plt.xticks(rotation = 30),需求背景:当刻度值过大时,水平放置会导致刻度重叠,因此需要对刻度值进行旋转,30为旋转角度;
  4. 网格线设置:
    - 只保留横向网格线或只保留纵向网格线:plt.grid(aixs='y) or plt.grid(axis='x')
    - 将网格线置于最底层,以免遮挡目标图形:plt.grid(zorder=0),注意,这里还需要在目标绘图函数(eg: plot、bar、hist) 中添加参数zorder=100

保存图片

  1. 基本操作:fig.savefig('file_name') or plt.savefig('file_name')
  2. 设置透明背景:plt.savefig('file_name',transparent=True)
  3. 设置边框大小一致:plt.savefig('file_name',bbox_inches = 'tight')
  4. 设置画布内外颜色:plt.savefig('file_name',facecolor = 'violet',edgecolor = 'lightgreen')
  5. 设置图片分辨率:ply.savefig('file_name', dpi=600)

绘图模板

柱状图+折线图+标注设置
def bar_line(x_list,y_list,color_list,label_list,tag_list,tit,width=0.2,if_save=False):
    mpl.rcParams['font.family'] = 'WenQuanYi Micro Hei'
    plt.figure(figsize=(10,5))
    for i in range(len(y_list)): # bar + plot
        plt.bar([x+(i-1)*width for x in x_list], y_list[i], width,color = color_list[i],label = label_list[i],zorder = 100)
        plt.plot(x_list, y_list[i],'--',color = color_list[i],label = label_list[i], zorder = 100,linewidth=2.5)
    for i in range(len(x_list)): # text
        for j in range(len(y_list)):
            plt.text(x_list[i]+(j-1)*width, y_list[j][i] + 1, y_list[j][i], ha='center', fontsize=12)

    plt.title(tit,fontsize = 18)
    # x轴刻度标签位置不进行计算
    plt.xticks(ticks = np.arange(1,len(tag_list)+1),labels = tag_list,fontsize = 15)
    plt.yticks(fontsize = 15)
    plt.legend(fontsize = 15)
    plt.grid(axis = 'y',zorder=0)
    if if_save:
        plt.savefig(tit+'.png',bbox_inches = 'tight',dpi=600)
    plt.show()
堆叠柱状图

注意,这里的y_list[i]必须为numpy.ndarray类型的数据,否则无法累加

########### 堆叠柱状图
def stacked_bar(x_list,y_list,color_list,label_list,tag_list,tit,y_label,width=0.2,if_save=False):
    mpl.rcParams['font.family'] = 'WenQuanYi Micro Hei'
    plt.figure(figsize=(20,5))
    bottom = np.array([0]*len(tag_list))
    for i in range(len(y_list)):
        plt.bar(x_list, y_list[i], width,color = color_list[i],label = label_list[i],zorder = 100,bottom=bottom)
        bottom += y_list[i]
    plt.title(tit,fontsize = 20)
    plt.ylabel(y_label,fontsize = 18)
    # x轴刻度标签位置不进行计算
    plt.xticks(ticks = np.arange(1,len(tag_list)+1),labels = tag_list,fontsize = 15,rotation=30)
    plt.yticks(fontsize = 15)
    plt.legend(fontsize = 15)
    plt.grid(axis = 'y',zorder=0)
    if if_save:
        plt.savefig(tit+'.png',bbox_inches = 'tight',dpi=600)
    plt.show()

猜你喜欢

转载自blog.csdn.net/zyl_wjl_1413/article/details/125572125