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位置刻度轴箭头等的主要内容,如果未能解决你的问题,请参考以下文章