前言

众所周知,通过数据绘图,我们可以将枯燥的数字转换成容易被人们接受的图表,从而让人留下更加深刻的印象。而大多数编程语言都有自己的绘图工具,matplotlib就是基于Python的绘图工具包,使用它我们可以仅仅使用几行代码就生成 饼图、直方图、功率谱、条形图、错误图、散点图、气泡图,甚至生成动态图型也都很轻松。而且它的绘图方法丰富,可以在各种交互式环境中运行,且生成的图像质量高、兼容各种硬拷贝格式。

博主也是在测试一个算法的时候,为了更直观的呈现数据走向,学习了它的相关用法,这篇博客大部分内容是在此过程中的学习笔记。

matplotlib的官网地址是https://matplotlib.org/gallery,下面这些是他们官网的一些示例图形。





安装

pip安装

Matplotlib的安装比较容易,可以直接通过pip安装,也可以通过下载安装包的方式安装。博主使用的是python3,相关的安装命令如下:

pip3 install matplotlib

安装包安装

如果你的Python3可以直接点击下面的py3链接下载进行安装,则点击可以点击其他python版本下载对应Python版本进行安装

matplotlib-1.4.3.win-amd64-py3

其他python版本

柱状图

主要方法

用python画柱状图很容易,主要的方法是:

atplotlib.pyplot.bar(left, height, width=0.8, bottom=None, hold=None, data=None, **kwargs)

参数说明

  • left: 每一个柱形左侧的X坐标
  • height:每一个柱形的高度
  • width: 柱形之间的宽度
  • bottom: 柱形的Y坐标
  • color: 柱形的颜色

示例代码

import matplotlib.pyplot as plt
import time source_data = {'mock_verify': 369, 'mock_notify': 192, 'mock_sale': 517} # 设置原始数据 for a, b in source_data.items():
plt.text(a, b + 0.05, '%.0f' % b, ha='center', va='bottom', fontsize=11) # ha 文字指定在柱体中间, va指定文字位置 fontsize指定文字体大小 # 设置X轴Y轴数据,两者都可以是list或者tuple
x_axis = tuple(source_data.keys())
y_axis = tuple(source_data.values())
plt.bar(x_axis, y_axis, color='rgb') # 如果不指定color,所有的柱体都会是一个颜色 plt.xlabel(u"渠道名") # 指定x轴描述信息
plt.ylabel(u"访问量") # 指定y轴描述信息
plt.title("渠道访问量统计表") # 指定图表描述信息
plt.ylim(0, 600) # 指定Y轴的高度
plt.savefig('{}.png'.format(time.strftime('%Y%m%d%H%M%S'))) # 保存为图片
plt.show()

效果图

解决中文显示问题

从上面的图片看到,matplotlib绘制图像显示中文时,中文会变成小方格子。搜了很多资料,最佳的解决方法是动态设置参数,添加下面的代码。

from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

修改后的图片

饼状图

主要方法

用python画柱状图的主要方法如下:

plt.pie(x=fracs, labels=labels, explode=explode, autopct='%3.1f %%',shadow=False, labeldistance=1.1, startangle=0, pctdistance=0.8)

示例代码

相关的参数已在注释中说明

import matplotlib.pyplot as plt
data = {'8516464': 106, '8085460': 704, '7593813': 491, '8709362': 24, '8707829': 6, '8684658': 23, '8679301': 11,
'8665923': 29, '8660909': 23, '8652968': 31, '8631727': 31, '8622935': 24, '8620593': 18, '8521737': 33,
'8605441': 49, '8495205': 82, '8477276': 57,'8474489': 71, '8456502': 50, '8446529': 68, '8433830': 136,
'8254158': 103, '8176029': 88, '8081724': 58, '7922592': 185, '7850099': 62,'7617723': 61, '7615562': 90,
'7615052': 57, '7604151': 102, '7511294': 59,'6951654': 27, '6946388': 142, '6945373': 159, '6937716': 347,
'7460176': 64, '7246377': 87, '7240621': 145, '7204707': 645, '7028401': 671}
source_data = sorted(data.items(), key=lambda x: x[1], reverse=True)
print(source_data)
labels = [source_data[i][0][:4] for i in range(len(source_data))] # 设置标签
fracs = [source_data[i][1] for i in range(len(source_data))]
explode = [x * 0.01 for x in range(len(source_data))] # 与labels一一对应,数值越大离中心区越远
plt.axes(aspect=1) # 设置X轴 Y轴比例
# labeldistance标签离中心距离 pctdistance百分百数据离中心区距离 autopct 百分比的格式 shadow阴影
plt.pie(x=fracs, labels=labels, explode=explode, autopct='%3.1f %%',
shadow=False, labeldistance=1.1, startangle=0, pctdistance=0.8, center=(-1, 0))
# 控制位置:bbox_to_anchor数组中,前者控制左右移动,后者控制上下。ncol控制 图例所列的列数。默认值为1。fancybox 圆边
plt.legend(loc=7, bbox_to_anchor=(1.2, 0.80), ncol=3, fancybox=True, shadow=True, fontsize=8)
plt.show()

效果图

动态图

主要方法

用python画动态图的主要方法如下:

ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
init_func=init, blit=True)

动态图官方使用介绍

可以访问下面的链接查看它官网的使用介绍

示例代码

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import time
# Fixing random state for reproducibility
np.random.seed(196)
# 初始数据绘图
dis = np.zeros(40)
dis2 = dis
fig, ax = plt.subplots()
line, = ax.plot(dis)
ax.set_ylim(-1, 1)
plt.grid(True)
ax.set_ylabel("distance: m")
ax.set_xlabel("time") def update(frame):
global dis
global dis2
global line
# 读入模拟
a = np.random.rand() * 2 - 1
time.sleep(np.random.rand() / 10)
# 绘图数据生成
dis[0:-1] = dis2[1:]
dis[-1] = a
dis2 = dis
# 绘图
line.set_ydata(dis)
# 颜色设置
plt.setp(line, 'color', 'c', 'linewidth', 2.0)
ani = animation.FuncAnimation(fig, update, frames=None, interval=100)
plt.show()

效果图:

颜色设置

matplotlib中对显示的字体和颜色都可以进行定制:

内建颜色

内建颜色 蓝色 绿色 红色 青色 品红 黄色 黑色
对应字符 'b' 'g' 'r' 'c' 'm' 'y' 'k'

其他颜色

其他的颜色使用可以参考下面这篇博客

字体设置

字体 对应字体
黑体 SimHei
微软雅黑 Microsoft YaHei
微软正黑体 Microsoft JhengHei
新宋体 NSimSun
新细明体 PMingLiU
细明体 MingLiU
标楷体 DFKai-SB
仿宋 FangSong
楷体 KaiTi
仿宋_GB2312 FangSong_GB2312
楷体_GB2312 KaiTi_GB2312

参考资料:

  1. https://blog.csdn.net/u010758410/article/details/71743225

  2. https://blog.csdn.net/jenyzhang/article/details/52047557

  3. https://www.cnblogs.com/darkknightzh/p/6117528.html

  4. https://www.zhihu.com/question/49481680/answer/344653927

【Python】模块学习之matplotlib柱状图、饼状图、动态图及解决中文显示问题的更多相关文章

  1. Python的可视化包 – Matplotlib 2D图表(点图和线图,.柱状或饼状类型的图),3D图表(曲面图,散点图和柱状图)

    Python的可视化包 – Matplotlib Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型地2D图表和一些基本的3D图表.Matplotlib最早是为了可 ...

  2. 【转】Python模块学习 - fnmatch & glob

    [转]Python模块学习 - fnmatch & glob 介绍 fnmatch 和 glob 模块都是用来做字符串匹配文件名的标准库. fnmatch模块 大部分情况下使用字符串匹配查找特 ...

  3. 【目录】Python模块学习系列

    目录:Python模块学习笔记 1.Python模块学习 - Paramiko  - 主机管理 2.Python模块学习 - Fileinput - 读取文件 3.Python模块学习 - Confi ...

  4. Python模块学习filecmp文件比较

    Python模块学习filecmp文件比较 filecmp模块用于比较文件及文件夹的内容,它是一个轻量级的工具,使用非常简单.python标准库还提供了difflib模块用于比较文件的内容.关于dif ...

  5. JupyterLab绘制:柱状图,饼状图,直方图,散点图,折线图

    JupyterLab绘图 喜欢python的同学,可以到 https://v3u.cn/(刘悦的技术博客) 里面去看看,爬虫,数据库,flask,Django,机器学习,前端知识点,JavaScrip ...

  6. ECharts学习(2)--饼状图之南丁格尔图

    1.上一篇中讲了如何绘制一个简单的柱状图,这次要画的是饼图,饼图主要是通过扇形的弧度表现不同类目的数据在总和中的占比,它的数据格式比柱状图更简单,只有一维的数值,不需要给类目.因为不在直角坐标系上,所 ...

  7. python模块学习第 0000 题

    将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果: 好可爱>%<! 题目来源:https://github.com/Yixiao ...

  8. PSP 进度条 柱状图 饼状图

    9号 类别 开始时间 结束时间 间隔 净时间 燃尽图 8::00 8:20 0 20分钟 站立会议 8:20 8:50 0 30分钟 读构建之法 9:20 13:20 120分钟 120分钟 四人小组 ...

  9. Python模块学习:logging 日志记录

    原文出处: DarkBull    许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net ...

随机推荐

  1. 170801、VM性能调优

    最近因项目存在内存泄漏,故进行大规模的JVM性能调优 , 现把经验做一记录. 一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老 ...

  2. Asp.net读取和写入txt文件方法(实例)!

    Asp.NET读取和写入txt文件方法(实例)! [程序第一行的引入命名空间文件 - 参考] System; using System.Collections; using System.Config ...

  3. pouch架构源码分析

    // daemon/daemon.go 1.func NewDaemon(cfg config.Config) *Daemon 调用containerStore, err := meta.NewSto ...

  4. day10(java web之request&respone&访问路径&编码问题)

    day10 请求响应流程图 response response概述 response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletR ...

  5. hdu 5056 Boring count (窗体滑动)

    You are given a string S consisting of lowercase letters, and your task is counting the number of su ...

  6. 省市县三级联动的SQL

    完整版见https://jadyer.github.io/ 首先是建表语句 CREATE TABLE `t_address_province` ( `id` INT AUTO_INCREMENT PR ...

  7. JDK安装(linux系统)

    安装好centos6.8以后,输入命令: 如果显示如下: 证明系统自带了JDK,需要手动删除. 然后搜索: 备注: 查询一个包是否被安装 # rpm -q < rpm package name& ...

  8. 【查看】mysql 常规书写注意事项(那些坑)

    mysql 常规书写注意事项,mysql注意事项 1. 注释:  -- 后面一定要加一个空格,否则会报错 2.注释:/*! content */ 在mysql中是会执行的,但是其他数据库不会.   例 ...

  9. android showDialog用法

    protected Dialog onCreateDialog(int id) { // TODO Auto-generated method stub switch(id){ case 10: re ...

  10. Linux下如何执行Shell脚本

    Linux下你可以有两种方式执行Shell脚本: 1.用shell程序执行脚本:根据你的shell脚本的类型,选择shell程序,常用的有sh,bash,tcsh等(一般来说第一行#!/bin/bas ...