matplotlib散点图常见问题及解决方案

2023-11-17 14:04:38 浏览数 (1)

自定义横纵坐标科学计数法格式

坐标刻度如果太大或者太小, 默认就会显示科学计数法, 但是科学计数法却不是自己想要的格式, 通过以下方式即可自定义

复现代码如下

代码语言:javascript复制
# -*- coding: utf-8 -*-
# @Author: Mehaei
# @Date:   2023-11-16 19:55:02
# @Last Modified by:   Mehaei
# @Last Modified time: 2023-11-16 19:55:31
import matplotlib.pyplot as plt


def main():
    x = range(1000000, 9000000, 100000)
    y = range(10000000, 90000000, 1000000)
    plt.scatter(x, y)
    plt.show()


main()

效果图

使用下面方法可以自定义刻度显示的格式

解决代码如下

代码语言:javascript复制
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter


def formatnum(x, pos):
    return "{:.1e}".format(x)


formatter = FuncFormatter(formatnum)


def main():
    x = range(1000000, 9000000, 100000)
    y = range(10000000, 90000000, 1000000)
    plt.scatter(x, y)
    plt.gca().yaxis.set_major_formatter(formatter)
    plt.gca().xaxis.set_major_formatter(formatter)
    plt.show()


main()

效果图

显示中文(添加自定义字体)

代码语言:javascript复制
def main():
    x = range(1000000, 9000000, 100000)
    y = range(10000000, 90000000, 1000000)
    plt.scatter(x, y)
    plt.title("中文标题")
    plt.xlabel("x轴")
    plt.ylabel("y轴")
    plt.show()

效果图

添加字体对象, 将字体对象添加到需要显示中文的地方

代码语言:javascript复制
from matplotlib.font_manager import FontProperties


font = FontProperties(fname="97txj03p17q39w692ecpjely52o1v6z9.ttf", size=30)
xyfont = FontProperties(fname="97txj03p17q39w692ecpjely52o1v6z9.ttf", size=15)


def main():
    x = range(1000000, 9000000, 100000)
    y = range(10000000, 90000000, 1000000)
    plt.scatter(x, y)
    plt.title("中文标题", fontproperties=font)
    plt.xlabel("x轴", fontproperties=xyfont)
    plt.ylabel("y轴", fontproperties=xyfont)
    plt.show()

可以为x和y轴设置不同的字体, 当然也有其它方式,比如: 设置全局字体, 将字体放入安装包内等

效果图

其它问题

最后直接放完整代码了, 功能和解决方案都在注释里了

代码语言:javascript复制
# -*- coding: utf-8 -*-
# @Author: Mehaei
# @Date:   2023-11-16 19:55:02
# @Last Modified by:   Mehaei
# @Last Modified time: 2023-11-16 21:40:04
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
from matplotlib.font_manager import FontProperties
font = FontProperties(fname="97txj03p17q39w692ecpjely52o1v6z9.ttf", size=30)
xyfont = FontProperties(fname="97txj03p17q39w692ecpjely52o1v6z9.ttf", size=15)


def formatnum(x, pos):
    """
    格式化刻度
    """
    return "{:.1e}".format(x)


formatter = FuncFormatter(formatnum)


def main():
    """
    生成散点图
    """
    x = range(1000000, 9000000, 100000)
    y = range(10000000, 90000000, 1000000)
    yy = range(10000000, 50000000, 500000)
    # 图例显示为点(默认)
    plt.scatter(x, y, label="图例1")
    # 添加多条y轴
    plt.scatter(x, yy, label="图例2")
    # 图例显示为横线
    # plt.scatter(x, y)
    # plt.plot([], [], label="图例1")
    # plt.scatter(x, yy)
    # plt.plot([], [], label="图例2")
    # 设置标题和x轴和y轴标题字体和大小
    plt.title("中文标题", fontproperties=font)
    plt.xlabel("x轴", fontproperties=xyfont)
    plt.ylabel("y轴", fontproperties=xyfont)
    # 设置x轴和y轴字体大小
    plt.xticks(fontproperties=xyfont)
    plt.yticks(fontproperties=xyfont)
    # 取消上边框和右边框
    plt.gca().spines['top'].set_visible(False)
    plt.gca().spines['right'].set_visible(False)
    # 添加文字
    plt.text(1, 1, "注意n测试", horizontalalignment="right", verticalalignment="top", transform=plt.gca().transAxes, fontproperties=xyfont)
    # 自定义坐标刻度值
    # plt.gca().yaxis.set_major_formatter(formatter)
    # plt.gca().xaxis.set_major_formatter(formatter)
    # 添加图例
    plt.legend(loc="upper left", title_fontsize="medium", fontsize="medium", prop=xyfont)
    # 显示
    plt.show()
    # 保存图片
    """
    dpi: 像素
    bbox_inches: 图表紧凑型(旁边不留那么多空白)
    """
    # plt.savefig("test.png", dpi=200, bbox_inches="tight")
    # 清空画布
    plt.cla()


main()

到这里就可以解决大部分问题了, 其它问题一搜就知道怎么解决了

最终效果图

0 人点赞