专栏首页MeteoAI如何用python画图--matplotlib实例与补充

如何用python画图--matplotlib实例与补充

今天我们给大家补充一些matplotlib的常用技能,赶紧来学习吧~

1. Figure, Axes, Axis的关系:

在第一篇文章中,大家一定看到了包含Figure,Axes,Axis等的代码,可能会一头雾水,不知道这些分别表示什么。这里就给大家仔细解释一下。掌握了这些之后,绘图就游刃有余啦。

如下图所示,Figure是绘制对象,一个Figure对象可以包含多个Axes子图,一个Axes是一个绘图区域,不加设置时,Axes为1,且每次绘图其实都是在figure上的Axes上绘图。 Axis表示坐标轴。

一个Figure对象中可以包含一个或者多个Axes对象,每个Axes对象都拥有独立的绘图区域。

一个图中更多的参数设置,详情请查阅官网(墙裂建议查阅)

2. 毕业论文中的实例图:

大家一定很好奇,在论文级别的略微复杂一些的图如何操作呢?

这就给大家分享一个实例。代码是可以直接运行的,墙裂建议大家用它来练练手,一行代码一行代码的熟悉一下,相信你们会学到很多!

如果还不会配置python的环境,请移步一文教你解决Python所有安装配置

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False  #用来正常显示负号

### Data:
#1290-2017
a1=(21.98, 14.97, 7.42, 3.30)
a2=(24.07, 16.59, 8.41, 3.50)
a3=(19.,   12.67, 6.,   3.  )
#1290-1850
b1=(22.10,  13.73,  6.42,  2.67)
b2=(24.34,  15.84,  7.62,  2.93)
b3=(18.64,  10.45,  4.55,  2.27)
#1850-2017
c1=(21.56,  19.16,  10.78,  5.39)
c2=(22.99,  19.54 , 11.49,  5.75)
c3=(20.  ,  18.75,  10.  ,  5.  )
#1981-2017
d1=(16.22, 16.22,  13.51,  5.41)
d2=(25.,   25., 25.,  10.)
d3=(5.88,  5.88, 0.,  0.)

### Plot:
ind = np.arange(4)  # the x locations for the groups
width = 0.2  # the width of the bars

fig, ax = plt.subplots(2,2,figsize=(15, 15),dpi=100)

rects1 = ax[0,0].bar(ind - 0.2, a1, width, color='mediumseagreen', label='所有年份')
rects2 = ax[0,0].bar(ind , a2, width, color='IndianRed', label='海冰偏少年')
rects3 = ax[0,0].bar(ind + 0.2, a3, width, color='steelblue', label='海冰偏多年')

# Add some text for labels, title and custom x-axis tick labels, etc.
ax[0,0].set_ylabel(u'强冷冬年占比(%)',fontsize=20)
ax[0,0].set_title('(a) 1289-2017',fontsize=20)
ax[0,0].set_xticks(ind)
ax[0,0].set_xticklabels(('0.75 std', '1 std', '1.5 std', '2 std'),fontsize=20)
ax[0,0].legend(loc=0,prop={'size': 14},framealpha=0.3)
ax[0,0].tick_params(labelcolor='k', labelsize='20', width=3)
ax[0,0].set_ylim(0,26)

rects1 = ax[0,1].bar(ind - 0.2, d1, width, color='mediumseagreen', label='所有年份')
rects2 = ax[0,1].bar(ind , d2, width, color='IndianRed', label='海冰偏少年')
rects3 = ax[0,1].bar(ind + 0.2, d3, width, color='steelblue', label='海冰偏多年')
# Add some text for labels, title and custom x-axis tick labels, etc.
# ax[0,1].set_ylabel(u'强冷冬年占比(%)',fontsize=20)
ax[0,1].set_title('(b) 1981-2017',fontsize=20)
ax[0,1].set_xticks(ind)
ax[0,1].set_xticklabels(('0.75 std', '1 std', '1.5 std', '2 std'),fontsize=20)
ax[0,1].legend(loc=0,prop={'size': 14},framealpha=0.3)
ax[0,1].tick_params(labelcolor='k', labelsize='20', width=3)
ax[0,1].set_ylim(0,26)

rects1 = ax[1,0].bar(ind - 0.2, b1, width, color='mediumseagreen', label='所有年份')
rects2 = ax[1,0].bar(ind , b2, width, color='IndianRed', label='海冰偏少年')
rects3 = ax[1,0].bar(ind + 0.2, b3, width, color='steelblue', label='海冰偏多年')
# Add some text for labels, title and custom x-axis tick labels, etc.
ax[1,0].set_ylabel(u'强冷冬年占比(%)',fontsize=20)
ax[1,0].set_title('(c) 1290-1850',fontsize=20)
ax[1,0].set_xticks(ind)
ax[1,0].set_xticklabels(('0.75 std', '1 std', '1.5 std', '2 std'),fontsize=20)
ax[1,0].legend(loc=0,prop={'size': 14},framealpha=0.3)
ax[1,0].tick_params(labelcolor='k', labelsize='20', width=3)
ax[1,0].set_ylim(0,26)

rects1 = ax[1,1].bar(ind - 0.2, c1, width, color='mediumseagreen', label='所有年份')
rects2 = ax[1,1].bar(ind , c2, width, color='IndianRed', label='海冰偏少年')
rects3 = ax[1,1].bar(ind + 0.2, c3, width, color='steelblue', label='海冰偏多年')
# Add some text for labels, title and custom x-axis tick labels, etc.
# ax[3].set_ylabel(u'强冷冬年占比(%)',fontsize=20)
ax[1,1].set_title('(d) 1850-2017',fontsize=20)
ax[1,1].set_xticks(ind)
ax[1,1].set_xticklabels(('0.75 std', '1 std', '1.5 std', '2 std'),fontsize=20)
ax[1,1].legend(loc=0,prop={'size': 14},framealpha=0.3)
ax[1,1].tick_params(labelcolor='k', labelsize='20', width=3)
ax[1,1].set_ylim(0,26)
# ax[1,1].set_yticks([-1,0,1])

plt.subplots_adjust(hspace =0.128)
plt.subplots_adjust(wspace =0.078)
plt.show()

3. matplotlib如何正常显示中文:

许多朋友会发现,中文字符有时候在matplotlib中显示不正常,这也是正常现象,下面来教大家怎么一步一步解决这个问题。
【1】 Windows:
# 画图之前加上:
# 用来正常显示中文标签,u'内容'
plt.rcParams['font.sans-serif']=[u'SimHei']  # 或其他系统有的字体,比如: ['Microsoft YaHei']
# 用来正常显示负号
plt.rcParams['axes.unicode_minus']=False

# 同样,可以进行一些其他画图配置:
plt.rcParams['figure.figsize']=10,10
plt.rcParams['figure.dpi']=300
【2】 Mac:

但是,但是... 以上的操作在mac上无效 !!!

因为在mac中的/Library/Fonts文件夹中,虽有多种不同的字体,但并没有显示中文的SimHei.ttf,所以需要先进行下载和安装,并修改一下matplotlibrc脚本,就可以使得matplotlib在画图时正常显示中文了。

  • 第一步:下载字体并安装:SimHei
  • 第二步:将字体文件SimHei.ttf拷贝到python安装路径/site-packages/matplotlib/mpl-data/fonts/ttf目录中
  • 第三步:修改~python安装路径/site-packages/matplotlib/mpl-data/matplotlibrc文件。找到如下两项,去掉前面的#,并在font.sans-serif冒号后面加上SimHei,如下:
font.family         : sans-serif       
font.sans-serif     : SimHei, Bitstream Vera Sans, Lucida Grande,Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif

同时找到axes.unicode_minus,将True改为False,以解决负号’-‘显示为方块的问题。

  • 第四步:在脚本运行前加入:
# matplotlib不会每次启动时都重新扫描所有的字体文件并创建字体索引列表,
# 因此在复制完字体文件之后,需要运行下面的语句以重新创建字体索引列表
import matplotlib as mpl
from matplotlib.font_manager import _rebuild
_rebuild()
#防止中文乱码问题
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False

在rebuild之后,可在之后使用中直接加入:

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

4. 更多的配色参考:

绘图时,可以供大家调色选择。

本文分享自微信公众号 - MeteoAI(meteoai)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • json读入小结

    回家已经11点后,写一点今天工作中用到的知识,不太熟练,耽误了些时间。因为任务紧急,类似这种对某个知识点不熟练,累计叠加起来,就会导致做事变慢,最终只能靠加班。

    double
  • 从0开始做系统

    Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据。后台管理可以在各个app的admin.py文件中进行控制。

    赵云龙龙
  • 面向 python 小白的贪吃蛇游戏

    作为 python 小白,总是觉得自己要做好百分之二百的准备,才能开始写程序。以至于常常整天在那看各种语法教程,学了几个月还是只会print('hello wo...

    Python进阶者
  • python的图像处理模块

    除了opencv专门用来进行图像处理,可以进行像素级、特征级、语义级、应用级的图像处理外,python中还有其他库用来进行简单的图像处理,比如图像的读入和保存、...

    于小勇
  • Leetcode【227、468、848、1081】

    这道题是实现一个基本计算器,即给一个只包括 +、-、*、/、数字和空格的字符串,计算结果。

    echobingo
  • 石晓文:算法入门必备指南

    写本文的目的,一是对自己研究生阶段所学习的知识做一个总结,二是希望对那些刚接触机器学习,准备往这个方向发展的同学们提供一些可借鉴的经验。

    double
  • python之异常处理

    我们在编码或者做产品的时候,不仅要考虑正向的,还要考虑到异常情况下如何处理。人生也是如此,成功的时候要考虑落败时,这样考虑问题就全面,周全。

    赵云龙龙
  • python和C的主要区别

    C语言是编译型语言,经过编译后,生成机器码,然后再运行,执行速度快,不能跨平台,一般用于操作系统,驱动等底层开发。python是编译型还是解释型这个界限并不明显...

    于小勇
  • Python 播放音频与录音

    os.system(file) 调用系统应用来打开文件,file 可为图片或者音频文件。

    Python进阶者
  • Python玩蛇指南:课程2分钱活动返场!

    ? 对的 我是个玩蛇的 (Python的原意是蟒蛇) ? 其实 在这个江湖中 玩蛇的花样千奇百怪 因而也衍生出了许多“黑话” 一般人玩蛇都是 web应用开发...

    腾讯NEXT学位

扫码关注云+社区

领取腾讯云代金券