Python matplotlib怎么画双X轴和双Y轴?

Python matplotlib怎么画双X轴和双Y轴? MATLAB里可以在一个图形里,通过设置画出下面这样的柱状图,即双Y轴,并且右侧Y轴刻度从上…
关注者
6
被浏览
49,701
登录后你可以
不限量看优质回答 私信答主深度交流 精彩内容一键收藏

本文主要介绍了使用Matplotlib模块经常遇到的一些情况,包括 绘制子图、设置图像背景、设置字体、设置标注、坐标轴显示设置、绘制两个y轴的图像

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# # 去除警告日志提醒的显示
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
plt.rcParams['figure.figsize'] = (6.0, 3.0)
plt.rcParams['font.sans-serif']=['SimSun'] #指定默认字体 SimHei为黑体
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.rcParams['savefig.dpi'] = 100 #图片像素
plt.rcParams['figure.dpi'] = 100 #分辨率

1. 绘制子图

1.1 一般子图

x=np.arange(1,100)
plt.figure(figsize=(6,6))                           # 设置画布大小
plt.subplot(221,                 # 定义2行2列4个图,并画第1幅折现图
            polar=False,         # 是否为极坐标形式,默认为False 
            ymargin=0.1
# plt.subplots_adjust() 设置子图的位置
plt.subplots_adjust(left=None, bottom=None, right=None, top=None,  # 这几个参数控制图片在画布中的位置
                    wspace=0.3, hspace=0.3)                            # 设置子图之间的行间距和列间距
plt.plot(x,x*x)
plt.xlabel('abc')
plt.subplot(222)                 # 画第2幅散点图
plt.scatter(np.arange(0,10), np.random.rand(10))
plt.subplot(223)                 # 画第3幅饼图                        
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0) 
plt.pie(sizes, labels=labels, 
        colors=['red','blue','green', 'yellow'],    # 颜色设置
        shadow=True,                                # 阴影显示
        labeldistance = 1.1,                        # 设置label距图的距离
        autopct="%.2f%%",                           # 设置百分比的显示  
        startangle=150,                             # 旋转角度
        explode = explode,                          # 哪一个部分要凸显出来
        textprops={'fontsize':10}                   # 设置字体大小
plt.subplot(224)                 # 画第4幅柱形图
plt.bar([20,10,30,25,15],[25,15,35,30,20],color='b')
plt.show()

1.2 不规则子图

x=np.arange(1,100)
plt.subplot(221)                # 定义2行2列4个图,并画第1幅折现图
plt.subplots_adjust(left=None, bottom=None, right=None, top=None,  # 这几个参数控制图片在画布中的位置
                    wspace=0.3, hspace=0.5) 
plt.plot(x,x*x)
plt.subplot(222)                # 画第2幅散点图
plt.scatter(np.arange(0,10), np.random.rand(10))
plt.subplot(212)                # 将画布重新定义为2行1列,并画第2幅图
plt.bar([20,10,30,25,15],[25,15,35,30,20],color='b')
plt.show()

2. 设置图像背景

很多情况下画出的图片需要时透明背景,或者是特定颜色的背景,保证引用到其他文件(如word、PPT等)时更加美观。

2.1 透明背景

# 可以直接再保存图片设置transparent=True
plt.plot(x,x*x)
plt.savefig('123.png', transparent=True)
plt.show()

2.2 特定颜色背景

plt.rcParams['axes.edgecolor']='#000000'        # 设置图框外背景颜色
plt.rcParams['axes.facecolor']='#FFFF00'        # 设置图框内背景颜色
plt.rcParams['savefig.facecolor']='#FFFFFF'     # 设置图像保存时颜色
plt.plot(x,x*x)
plt.savefig('123.png')
plt.show()

3. 设置字体

3.1 设置全局字体

font = {
         'family':'SimSun',  # 设置中文字体
                             # 黑体:SimHei;微软雅黑:Microsoft YaHei;宋体:SimSun;新宋体:NSimSun;楷体 : KaiTi;
         'size':'10',        # 设置字号
plt.rc("font",**font)
plt.title('设置全局字体')
plt.plot(x,x*x)
plt.show()

3.2 设置局部字体

font = {'family':'SimSun',       # 设置中文字体
                                 # 黑体:SimHei;微软雅黑:Microsoft YaHei;宋体:SimSun;新宋体:NSimSun;楷体 : KaiTi;
        'size':'15'              # 设置字号    
plt.title('设置全局字体',fontdict=font)  
plt.plot(x,x*x)
plt.show()

4. 设置标注

x = np.arange(0, 6)
y = x * x
plt.plot(x, y, marker='o')
plt.ylim(-2, 30)
for xy in zip(x, y):
    plt.annotate("(%s,%s)" % xy,               # 设置标注的内容(字符串)
                 xy=xy,                        # 为被注释的坐标点
                 xytext=(-20, 20),             # 注释内容的坐标点(相对于被注释点)
                 textcoords='offset pixels',   # 设置注释文本的坐标系属性
                 c='r',                        # 设置标注颜色
                 fontsize=10                   # 设置标注字体大小
plt.show()

5. 坐标轴显示设置

# 4个边框显示设置
plt.plot(x,x*x)
plt.xticks(ticks=np.arange(1, 10, 1),              # 设置x坐标轴的坐标值
           labels=['a', 'b', 'c', 'd', 'e', 'f',   # 将ticks设置的坐标值改为labels的列表
                   'g', 'h', 'i', 'j', 'k'],
           c='black',                              # 设置坐标值的颜色
           rotation=30,                            # 设置x轴的倾斜角度
           fontsize=15                             # 设置坐标值大小
plt.yticks(ticks=np.arange(0, 200, 20))
plt.tick_params(labelsize = 15,                    # 设置坐标值的大小(x方向和y方向同时设置
                colors='gold',                     # 同时设置坐标值和刻度线的颜色
                width=1                            # 设置刻度线的宽度
ax = plt.gca()                               # 获取边框对象,方便后面操作
ax.spines["right"].set_color("white")        # 设置右侧颜色(当颜色和背景相同,边框就相当于消失了)
ax.spines["left"].set_color("orange")        # 修改左侧颜色
ax.spines["top"].set_color("yellow")         # 修改上边颜色
ax.spines["bottom"].set_color("purple")      # 修改下边颜色
# ax.spines["right"].set_visible(False)        # 隐藏掉右侧边框,还可以将right替换为left,top,bottom
plt.show()

6. 两个y轴

一幅图有两个y轴其实是两幅图的叠加,并且公用一个x轴,所有使用的是 matplotlib.axes.Axes.twinx() 这个函数,因为是两幅图的重叠,所以在显示一些信息(如标注信息)会出现重叠,解决的方法是设置图例的位置坐标,保证不被覆盖。

x = np.arange(1, 11, 1)
y1 = np.random.uniform(10, 20, size=10)
y2 = np.random.uniform(10, 20, size=10)
fig, ax1 = plt.subplots()
ax1.set_xlabel('x轴')                     # 画第一组数据,使用左侧的y轴信息 
ax1.set_ylabel('y1')
ax1.bar(x, y1, color='b',label='y1数据')
ax1.tick_params(axis='y')
ax1.set_xticks(x)                         # 设置x轴坐标
ax1.set_ylim(0, 25)                       # 调整左侧y轴的范围
plt.legend(bbox_to_anchor=(1, 1),         # 设置图例的位置坐标,保证不被掩盖
           fontsize=10,                   # 设置图例字体大小
           frameon=False)                 # 不显示图例边框
ax2 = ax1.twinx()                         # 再次设置一个x轴,画第二组数据
color = 'tab:blue'
ax2.set_ylabel('y2')  
ax2.plot(x, y2, color='r',label='y2数据')
ax2.tick_params(axis='y')
ax2.set_ylim(0, 25)                        # 调整右侧y轴的范围