matplotlib绘制图表,设置刻度标签最大最小刻度字体大小,label位置刻度轴箭头等

Posted 程序媛一枚~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matplotlib绘制图表,设置刻度标签最大最小刻度字体大小,label位置刻度轴箭头等相关的知识,希望对你有一定的参考价值。

matplotlib绘制图表,设置刻度标签、最大最小刻度、字体大小,label位置、刻度轴箭头等

写这篇博客源于博友的提问,之前涉及到不少自定义坐标轴设置,这篇博客将整合介绍如何使用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 pd
from matplotlib import ticker
from 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 = 1945
y0 = 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 = 1945
maxx = 2028
miny = 0
maxy = 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 pd
from matplotlib import ticker
from 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 = 50
y0 = 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')

以上是关于matplotlib绘制图表,设置刻度标签最大最小刻度字体大小,label位置刻度轴箭头等的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib基础使用

Matplotlib 库 : 绘图和可视化

Matplotlib 条形图:对角刻度标签

Python,x轴标题与matplotlib中的刻度标签重叠

matplotlib绘制图表时x或y轴刻度值乱序的问题

用Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围