python3+matplotlib绘制双轴折线图(两种方法)

Background

这里提供两种方法,一种是基于pandas,另一种是基于twinx。
    pandas twinx

2、源码

import pandas as pd
import random
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator


def draw1(lx, dy, title):
    """画双轴折线图
    :param lx x轴数据集合
    :param dy y轴数据字典
    """
    # 设置图片可以显示中文和特殊字符
    plt.rcParams[font.sans-serif] = [SimHei]
    plt.rcParams[axes.unicode_minus] = False
    df = pd.DataFrame(dy, index=lx)
    fyt = list(dy.keys())[0]
    syt = list(dy.keys())[1]
    ax = df.plot(secondary_y=[syt], x_compat=True, grid=True, linewidth=0.8)
    ax.set_title(title)
    ax.set_ylabel(fyt)
    ax.grid(linestyle="--", alpha=0.3)
    ax.right_ax.set_ylabel(syt)
    plt.show()


def draw2(lx, dy, title):
    """画双轴折线图
    :param lx x轴数据集合
    :param dy y轴数据字典
    """
    # 设置图片可以显示中文和特殊字符
    plt.rcParams[font.sans-serif] = [SimHei]
    plt.rcParams[axes.unicode_minus] = False
    fyt = list(dy.keys())[0]
    syt = list(dy.keys())[1]
    plt.figure(figsize=(8, 5), dpi=120)
    plt.plot(lx, dy.get(fyt), label=fyt, linewidth=0.8, color=b)
    plt.grid(linestyle="--", alpha=0.3)
    plt.title(title, fontsize=12)
    plt.xticks(rotation=30)
    plt.ylabel(fyt, fontsize=9)
    # plt.ylim(-10, 30)
    plt.legend(loc=upper left)
    # 调用twinx后可绘制次坐标轴
    plt.twinx()
    plt.plot(lx, dy.get(syt), label=syt, linewidth=0.8, color=y)
    plt.ylabel(syt, fontsize=9)
    # plt.ylim(-60, 50)
    plt.legend(loc=upper right)
    # 设置x轴刻度
    ax = plt.gca()
    ax.xaxis.set_major_locator(MultipleLocator(2))
    plt.show()


def main():
    """主函数"""
    lx = pd.period_range(start=2022-01, periods=12, freq="M")
    y1 = [round(random.random(), 3) for i in range(12)]
    y2 = [random.randint(1, 40) for i in range(12)]
    dy = {
          
   应力(MPa): y1, 温度(℃): y2}
    title = 应力随温度变化情况
    # draw1(lx, dy, title)
    lxx = [str(i) for i in list(lx)]
    draw2(lxx, dy, title)


if __name__ == __main__:
    main()

3、另附两条线分开显示的方法

    方法就是设置y轴的刻度范围
经验分享 程序员 微信小程序 职场和发展