python:matplotlib画图总结,同时展示不同大小的图,显示中文

系统 452 0

文章目录

  • 1. 画单图、并列图、以及调整图的大小
    • 1.1. 生成图像
    • 1.2. 图中含有中文
    • 1.3. 设置大标题
    • 1.4. 生成子图
    • 1.5. 网格划分整个图像,同时展示不同大小的图
    • 1.6. 画折线图
    • 1.7. 画柱状图
    • 1.8. 设置子图的标题
    • 1.9. 设置坐标轴的label
    • 1.10. 设置以及修改坐标轴的刻度(ticks)
    • 1.11. 设置图例
    • 1.12. 保存以及显示图像
  • 2. 整体代码以及结果的展示
    • 2.1. 结果
    • 2.2. 代码

  这篇blog长期更新,主要总结matplotlib的作图技巧,matplotlib涉及画图的类有 pyplot(画图), axes(坐标轴), figure(图像)等,一般这三个类都有相应的函数,可以帮助我们进行画图,彼此之间有很大的重复,不同的blog一般偏重不同的类,所以给人的感觉就有点乱,点击类的名字可以超链接到各自的官方文档。

  这篇blog侧重axes类,但也会涉及到其他的类。首先导入下面的库

            
              import numpy as np
import pandas as pd
import seaborn as sns   # 画热力图需要的库,如果不画热力图可以不加
import matplotlib.pyplot as plt   # Python画图工具 
from matplotlib.gridspec import GridSpec     # 利用网格确定图形的位置

            
          

  我们就简单的画下面的数据到三个大小不同的子图上。

            
              x1 = np.linspace(1,10,10)
y1 = np.linspace(10,1,10)
x2 = range(1,11)
y2 = np.random.rand(10)   # 生成10个随机数
x3 = np.linspace(0,20,1000)
y3 = np.sin(x3)

            
          

1. 画单图、并列图、以及调整图的大小

1.1. 生成图像

  plt.figure()生成一个Figure对象,这个方法可以传入figsize参数调节生成图像的大小,注意这是整个图像的大小。

            
              fig = plt.figure(figsize=(20,20))

            
          

1.2. 图中含有中文

  如果图的标题等含有中文,需要加上下面的代码,matplotlib默认是不能显示中文的。

            
              plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

            
          

  matplotlib默认的英文字体输出挺丑的,这里我们输出英文时,改用比较正式的Times New Roman字体。

            
              plt.rcParams['font.sans-serif']=['Times New Roman']

            
          

1.3. 设置大标题

  fig.suptitle()函数设置大标题, 该方法可以传入x,y来调整图像的位置,注意这里的x,y是整个图像的x,y,后面axes的某些函数也有x,y,但一般是所画子图的x,y ;可以传入fontsize来改变标题的大小。后面会用axes的set_title()函数来设置子图的标题,注意标题的作用范围。

            
              fig.suptitle('测试', fontsize=30, x=0.5, y=0.93)

            
          

1.4. 生成子图

  fig.add_subplot(m, n, x)方法可以用于快速生成相同大小的子图,返回axes对象,含义是,我们把Figure分成 m × n m\times n m × n 个子图,生成的子图是其中的第x个,下面示例生成一个2*2共四个子图,

            
              ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
ax4 = fig.add_subplot(2,2,4)

            
          

  当然,如果我们只需要一个图,就没有子图的概念了,可以写成

            
              ax = fig.add_subplot(1,1,1)

            
          

1.5. 网格划分整个图像,同时展示不同大小的图

  这是一种进阶方法来生成子图,利用GridSpec(m, n)把1.1.生成的Figure划分成m行n列的网格图,这样的好处是,我们可以手动设置我们的图像占据其中的的若干行和若干列,实现同时展示不同大小的图的功能,设置代码如下

            
              gs = GridSpec(40, 40)   # 把Figure分成40*40的网格图
# ax1是axes对象,这一步意思是ax1画的图在原图(40*40)占据行5-14,占据列5-14(从零开始索引)
ax1 = fig.add_subplot(gs[5:15, 5:15])  

            
          

1.6. 画折线图

  我们可以利用axes.plot()画折线图, label参数会用于图例 ,这个函数有一些重要的参数可以看官方文档。

            
              ax1.plot(x1, y1, label='第一个子图')

            
          

1.7. 画柱状图

  我们可以利用axes.bor()画柱状图。

            
              ax2 = fig.add_subplot(gs[:20, 20:])   # ax2画的图在原图(40*40)占据行20-39,占据列20-39(从零开始索引)
ax2.bar(x2, y2, label='第二个子图')

            
          

1.8. 设置子图的标题

  我们可以利用axes.set_title()设置子图的标题,注意1.3.设置的是大标题,该方法同样可以传入x,y来调整图像的位置,x,y是相对子图的x,y;可以传入fontsize来改变标题的大小。

            
              ax1.set_title('第一', fontsize=30, x=0.5, y=1.02)

            
          

1.9. 设置坐标轴的label

  我们可以利用axes.set_xlabel()和axes.set_ylabel()分别设置x,y坐标轴的label,可以传入fontsize来改变标题的大小

            
              ax1.set_xlabel('X', fontsize=30)
ax1.set_ylabel('Y', fontsize=30)

            
          

1.10. 设置以及修改坐标轴的刻度(ticks)

  我们可以利用axes.set_xticks()和axes.set_yticks()分别设置x,y坐标轴的 刻度的位置 ,默认情况下,这些位置也就是刻度标签,但我们可以通过set_xticklabels()和set_yticklabels()将任何其他的值用作 标签

            
              ax1.set_xticks(range(0,10))   # 告诉matplotlib刻度存在的位置
ax1.set_xticklabels(['a', '上海','b', '广州','c', '北京','d', '南京','e', '浙江'])    # 告诉matplotlib刻度的位置上的刻度应该是什么

            
          

  同时,我们可以通过axes.tick_params()修改刻度的一些参数,axis={‘x’, ‘y’, ‘both’}用于确定需要改变的坐标轴, labelsize用于确定刻度的大小,rotation用于确定刻度是否要进行翻转,一般当x轴刻度过长时,可以设置rotation=90来让其旋转90度。

            
              ax1.tick_params(axis='x', labelsize=20, rotation=90)   # 改变ticks值
ax1.tick_params(axis='y', labelsize=20)   # 改变ticks值

            
          

1.11. 设置图例

  我们可以利用axes.legend()设置图例,图例就是我们在1.7或1.8中的label,当然可以重新定义(这一点可以看官网),这里可以通过fontsize调整图例大小, loc调整图例的位置。

            
              ax1.legend(fontsize=10, loc='upper right')

            
          

  有些高度封装的函数可能自己带图例,如果我们想要移除图例,可以

            
              axes.legend_.remove()

            
          

  如果想把图例设置到子图外面,我们可以利用

            
              ax1.legend(loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) 

            
          

其中参数loc=2就相当于loc=‘upper left’,也就是说,我们要把图例框的左上角,放在图的(1.05,1.0)坐标处,也就是放到图的外面。

1.12. 保存以及显示图像

  保存使用plt.savefig(),显示使用plt.show(), 一定要先保存后显示 ,因为plt.show()后就会生成一个新的空白图像,之后使用plt.savefig()就会存成空白的图像。

            
              plt.savefig('xxx.png')   # 一定在plt.show()前面
plt.show()

            
          

2. 整体代码以及结果的展示

2.1. 结果

python:matplotlib画图总结,同时展示不同大小的图,显示中文,常用函数介绍等_第1张图片

2.2. 代码

            
              fig = plt.figure(figsize=(20,20))

plt.rcParams['font.sans-serif']=['SimHei']  # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False  # 用于显示中文

# plt.rcParams['font.sans-serif']=['Times New Roman']

fig.suptitle('测试', fontsize=30, x=0.5, y=0.93)

# 生成相同大小的4个子图
# ax1 = fig.add_subplot(2,2,1)
# ax2 = fig.add_subplot(2,2,2)
# ax3 = fig.add_subplot(2,2,3)
# ax4 = fig.add_subplot(2,2,4)

# 生成一个图
# ax = fig.add_subplot(1,1,1)

gs = GridSpec(40, 40)

# 第一个子图
ax1 = fig.add_subplot(gs[5:15, 5:15])  # ax1是axes对象,这一步意思是ax1画的图在原图(40*40)占据行5-14,占据列5-14(从零开始索引)
ax1.plot(x1, y1, label='第一个子图')
ax1.set_title('第一', fontsize=30, x=0.5, y=1.02)
ax1.set_xlabel('X', fontsize=30)
ax1.set_ylabel('Y', fontsize=30)
ax1.set_xticks(range(0,10))   # 告诉matplotlib刻度存在的位置
ax1.set_xticklabels(['a', '上海','b', '广州','c', '北京','d', '南京','e', '浙江'])    # 告诉matplotlib刻度的位置上的刻度应该是什么
# ax1.set_yticks(range(0,10))
# ax1.set_yticklabels()
ax1.tick_params(axis='x', labelsize=20, rotation=90)   # 改变ticks值
ax1.tick_params(axis='y', labelsize=20)   # 改变ticks值
ax1.legend(fontsize=10, loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.)

# 第二个子图
ax2 = fig.add_subplot(gs[:20, 20:])   # ax2画的图在原图(40*40)占据行20-39,占据列20-39(从零开始索引)
ax2.bar(x2, y2, label='第二个子图')   
ax2.set_title('第二', fontsize=30, x=0.5, y=1.02)
ax2.set_xlabel('X', fontsize=30)
ax2.set_ylabel('Y', fontsize=30)
ax2.tick_params(axis='x', labelsize=25)   # 改变ticks值
ax2.tick_params(axis='y', labelsize=25)   # 改变ticks值
ax2.legend(fontsize=30, loc='upper right')

# 第三个子图
ax3 = fig.add_subplot(gs[22:, :])    # ax3画的图在原图(40*40)占据行22-39,占据所有的列(从零开始索引)
ax3.plot(x3, y3, label='第三个子图')   
ax3.set_title('第三', fontsize=30, x=0.5, y=1.02)
ax3.set_xlabel('X', fontsize=30)
ax3.set_ylabel('Y', fontsize=30)
ax3.tick_params(axis='x', labelsize=25)   # 改变ticks值
ax3.tick_params(axis='y', labelsize=25)   # 改变ticks值
ax3.legend(fontsize=30, loc='upper right')

plt.savefig('xxx.png')
plt.show()

            
          

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请请扫描上面二维码支持博主1元、2元、5元等您想捐的金额吧,狠狠点击下面给点支持吧

发表我的评论
最新评论 总共0条评论