matplotlib绘制图表,设置刻度标签、最大最小刻度、字体大小,label位置、刻度轴箭头等
1. 效果图2. 源码2.1 仅使用普通轴ax + fontdict 源码2.2 使用mpl设置全局字体 + ax fontdict源码写这篇博客源于博友的提问,之前涉及到不少自定义坐标轴设置,这篇博客将整合介绍如何使用matplotlib绘制图表,并设置刻度轴位置、最大最小刻度精度范围、最大最小刻度、坐标轴交点,标题label等字体大小、是否加粗、字体颜色、字体位置、刻度轴结束增加箭头等。
1. 效果图
方法一:使用普通的轴ax + fontdict设置字体、字体大小、是否加粗、字体颜色,以及设置轴的最小刻度精度,结束增加箭头等,效果图如下:
设置字体,支持中文设置字体,是否加粗,字体大小,字体颜色设置xlabel、ylabel字体大小及位置(xlabel可居左、中、右,ylabel可顶部、居中、底部)设置坐标轴的轴线交点(0,0)或者自己可配置设置x轴、y轴轴线位置设置x轴、y轴刻度精度最大、最小范围设置x轴、y轴刻度轴范围设置坐标轴结束增加箭头
方法二:使用全局mpl设置字体,效果图如下:
设置字体,支持中文设置xlabel、ylabel字体大小及位置(xlabel可居左、中、右,ylabel可顶部、居中、底部)设置x轴、y轴原点设置x轴、y轴位置设置x轴、y轴刻度精度最大、最小范围设置x轴、y轴刻度轴范围设置坐标轴结束增加箭头
2. 源码
2.1 仅使用普通轴ax + fontdict 源码
# matplotlib绘制象限图# 设置坐标轴的轴线交点(0,0)或者自己可配置,# 坐标轴结束增加箭头# 绘制散点图# 绘制文字# 绘制x,y轴标签位置# 设置字体,支持中文# 设置字体,是否加粗,字体大小,字体颜色# 设置xlabel、ylabel字体大小及位置(xlabel可居左、中、右,ylabel可顶部、居中、底部)# 设置x轴、y轴原点# 设置x轴、y轴轴线位置# 设置x轴、y轴刻度精度最大、最小范围# 设置x轴、y轴刻度轴范围# 直接可视化或者保存图片import pandas as pdfrom matplotlib import tickerfrom pylab import *print(matplotlib.get_backend())# 设置此行,才可以进行图片保存, 此行与plt.show()互相冲突# matplotlib.use('Agg')# 设置展示的刻度# 设置刻度轴位置# 刻度起始值、结束值、刻度最小精度、刻度间隔# 文字位置def setupx(ax, title, minx, maxx, major, minor, position="bottom"):# 定义刻度最大最小精度ax.xaxis.set_major_locator(ticker.MultipleLocator(major))ax.xaxis.set_minor_locator(ticker.MultipleLocator(minor)) # 最小刻度精度# 定义刻度位置ax.xaxis.set_ticks_position(position)ax.set_xlim(minx, maxx)ax.text(-0.5, -0.3, title, transform=ax.transAxes,fontsize=9, fontname='Monospace', color='black')def setupy(ax, title, minx, maxx, major, minor, position="left"):# 定义刻度最大最小精度ax.yaxis.set_major_locator(ticker.MultipleLocator(major))ax.yaxis.set_minor_locator(ticker.MultipleLocator(minor)) # 最小刻度精度# 定义刻度位置ax.yaxis.set_ticks_position(position)ax.set_ylim(minx, maxx)# 绘制教科书中的图,轴线绘制在(x0,y0)fig, ax = plt.subplots()x0 = 1945y0 = 0# 转移左和底部线到(x0,y0)的相对位置ax.spines["left"].set_position(("data", x0))ax.spines["bottom"].set_position(("data", y0))# 隐藏顶部和右边的脊柱线ax.spines["top"].set_visible(False)ax.spines["right"].set_visible(False)zbx = np.random.randint(1945, high=2028, size=(12,)).tolist()sly = np.random.randint(0, high=260, size=(12,)).tolist()data = pd.DataFrame({"zone": ['无锡市', '常州市 ', '镇江市', ' 徐州市', '连云港市', ' 扬州市', ' 盐城市', '淮安市', '南通市 ', ' 泰州市 ', ' 宿迁市 ', ' 南京市'],"占比": zbx,"数量": sly})# 为后续绘制散点图做准备(计算最大,最小x,y轴的值)minx = min(data["占比"] - 1)maxx = max(data["占比"] + 1)miny = min(data["数量"] - 1)maxy = max(data["数量"] + 1)minx = 1945maxx = 2028miny = 0maxy = 260# xaxix:position 可设置: 'top', 'bottom', 'both', 'default', 'none'setupx(ax, title="", position="bottom", minx=minx, maxx=maxx, major=10, minor=2)# yaxix:position 可设置:'left', 'right', 'both', 'default', 'none'setupy(ax, title="", position="left", minx=miny, maxx=maxy, major=40, minor=10)# 在坐标轴的末端绘制黑色三角箭头( ">k"/"^k")# 禁用剪辑(clip_on=False)放置从轴上溢出ax.plot(1, y0, ">k", transform=ax.get_yaxis_transform(), clip_on=False)ax.plot(x0, 1, "^k", transform=ax.get_xaxis_transform(), clip_on=False)# 支持中文mpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = False# 绘制散点图上去ax.scatter(data["占比"], data["数量"], color="green", marker='o', alpha=0.6) # 绿色圆形,透明度0.6\# 颜色、是否加粗,字体大小,字体采取默认fontdict = {'color': 'black','weight': 'bold','size': 12}# loc xlabel可设置 'left', 'center', 'right'plt.xlabel("占比", loc="right", fontdict={'color': 'black','weight': 'bold','size': 20}) # 设置x轴的文字标签# ylabel loc可设置:'bottom', 'center', 'top'plt.ylabel('数量', loc="center", fontdict=fontdict) # 设置y轴的文字标签# 添加文字到图表# - x:文本x轴坐标,可通过鼠标在图上定位获得合适的值,再生成最佳的图# - y:文本y轴坐标# - s:文本内容为‘数量’# - ha:设置字体的水平位置,可选'center', 'right', 'left'# - va:设置字体的垂直位置,可选'center', 'top', 'bottom', 'baseline', 'center_baseline'# - fontdict: 对字体属性进行个性化设置# size:设置字号# family:设置字体类型,可选'serif', 'sans-serif', 'cursive', 'fantasy', 'monospace'# weight:设置字体磅值,可选'light', 'normal', 'medium', 'semibold', 'bold', 'heavy', 'black'# plt.text(x=x0, y=maxy+3, s='数量', ha='left', va='baseline', fontdict=fontdict) # y轴文字标签显示横的# 给每个点添加zone标签for x, y, zone in zip(data["占比"], data["数量"], data["zone"]): # zip函数将x,y,zone数据一一对应,配对组合plt.text(x, y + 5, '%s' % zone, ha='center', va='bottom', fontdict={'color': 'blue','weight': 'normal','size': 8})plt.title('所有学者每年mesh变化',fontdict={'color': 'red','weight': 'bold','size': 14})plt.show()# 保存图片,注意得设置matplotlib.use('Agg'),否则保存的图为空白# plt.savefig('maps/xxt.jpg')
2.2 使用mpl设置全局字体 + ax fontdict源码
# matplotlib绘制象限图# 设置坐标轴的轴线交点(0,0)或者自己可配置,# 坐标轴结束增加箭头# 绘制散点图# 绘制文字# 绘制x,y轴标签位置# 直接可视化或者保存图片import pandas as pdfrom matplotlib import tickerfrom pylab import *print(matplotlib.get_backend())# 设置此行,才可以进行图片保存, 此行与plt.show()互相冲突# matplotlib.use('Agg')# 设置展示的刻度# 设置刻度轴位置# 刻度起始值、结束值、刻度最小精度、刻度间隔# 文字位置def setupx(ax, title, minx, maxx, major, minor, position="bottom"):# 只显示底部脊椎# ax.yaxis.set_major_locator(ticker.NullLocator())# ax.spines['right'].set_color('none')# ax.spines['left'].set_color('none')# if (position == "bottom"):#ax.spines['top'].set_color('none')# elif (position == "top"):#ax.spines['bottom'].set_color('none')# 定义刻度最大最小精度ax.xaxis.set_major_locator(ticker.MultipleLocator(major))ax.xaxis.set_minor_locator(ticker.MultipleLocator(minor)) # 最小刻度精度# 定义刻度位置ax.xaxis.set_ticks_position(position)ax.set_xlim(minx, maxx)ax.text(-0.5, -0.3, title, transform=ax.transAxes,fontsize=9, fontname='Monospace', color='black')def setupy(ax, title, minx, maxx, major, minor, position="left"):# 定义刻度最大最小精度ax.yaxis.set_major_locator(ticker.MultipleLocator(major))ax.yaxis.set_minor_locator(ticker.MultipleLocator(minor)) # 最小刻度精度# 定义刻度位置ax.yaxis.set_ticks_position(position)ax.set_ylim(minx, maxx)# ax.text(0.5, 0.3, title, transform=ax.transAxes,# fontsize=9, fontname='Monospace', color='black')# 绘制教科书中的图,轴线绘制在(x0,y0)fig, ax = plt.subplots()x0 = 50y0 = 200# 转移左和底部线到(x0,y0)的相对位置ax.spines["left"].set_position(("data", x0))ax.spines["bottom"].set_position(("data", y0))# 隐藏顶部和右边的脊柱线ax.spines["top"].set_visible(False)ax.spines["right"].set_visible(False)data = pd.DataFrame({"zone": ['无锡市', '常州市 ', '镇江市', ' 徐州市', '连云港市', ' 扬州市', ' 盐城市', '淮安市', '南通市 ', ' 泰州市 ', ' 宿迁市 ', ' 南京市'],"占比": [63.22, 75.25, 97.18, 23.97, 51.81, 80.93, 80.12, 67.41, 45.81, 31.75, 99, 76.9],"数量": [400, 403, 116, 318, 450, 361, 165, 408, 208, 208, 436, 344]})# 为后续绘制散点图做准备(计算最大,最小x,y轴的值)minx = min(data["占比"] - 1)maxx = max(data["占比"] + 1)miny = min(data["数量"] - 1)maxy = max(data["数量"] + 1)# xaxix:position 可设置: 'top', 'bottom', 'both', 'default', 'none'setupx(ax, title="", position="bottom", minx=minx, maxx=maxx, major=10, minor=2)# yaxix:position 可设置:'left', 'right', 'both', 'default', 'none'setupy(ax, title="", position="left",minx=miny, maxx=maxy, major=40, minor=10)# 在坐标轴的末端绘制黑色三角箭头( ">k"/"^k")# 禁用剪辑(clip_on=False)放置从轴上溢出ax.plot(1, y0, ">k", transform=ax.get_yaxis_transform(), clip_on=False)ax.plot(x0, 1, "^k", transform=ax.get_xaxis_transform(), clip_on=False)# 支持中文mpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = False# 绘制散点图上去ax.scatter(data["占比"], data["数量"], color="green", marker='o', alpha=0.6) # 绿色圆形,透明度0.6\# 颜色、是否加粗,字体大小,字体采取默认fontdict = {'color': 'black','weight': 'bold','size': 12}# loc xlabel可设置 'left', 'center', 'right'plt.xlabel("占比", loc="center", fontdict={'color': 'black','weight': 'bold','size': 20}) # 设置x轴的文字标签# ylabel loc可设置:'bottom', 'center', 'top'plt.ylabel('数量', loc="center", fontdict=fontdict) # 设置y轴的文字标签# 添加文字到图表# - x:文本x轴坐标,可通过鼠标在图上定位获得合适的值,再生成最佳的图# - y:文本y轴坐标# - s:文本内容为‘数量’# - ha:设置字体的水平位置,可选'center', 'right', 'left'# - va:设置字体的垂直位置,可选'center', 'top', 'bottom', 'baseline', 'center_baseline'# - fontdict: 对字体属性进行个性化设置# size:设置字号# family:设置字体类型,可选'serif', 'sans-serif', 'cursive', 'fantasy', 'monospace'# weight:设置字体磅值,可选'light', 'normal', 'medium', 'semibold', 'bold', 'heavy', 'black'# plt.text(x=x0, y=maxy+3, s='数量', ha='left', va='baseline', fontdict=fontdict) # y轴文字标签显示横的# 给每个点添加zone标签for x, y, zone in zip(data["占比"], data["数量"], data["zone"]): # zip函数将x,y,zone数据一一对应,配对组合plt.text(x, y + 5, '%s' % zone, ha='center', va='bottom', fontdict={'color': 'blue','weight': 'normal','size': 8})plt.show()# 保存图片,注意得设置matplotlib.use('Agg'),否则保存的图为空白# plt.savefig('maps/xxt.jpg')