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

33 篇文章 0 订阅
28 篇文章 0 订阅

目录

前言

安装

pip安装

安装包安装

柱状图

主要方法

参数说明

示例代码

效果图

解决中文显示问题

修改后的图片

饼状图

主要方法

示例代码

效果图

动态图

主要方法

动态图官方使用介绍

示例代码

颜色设置

内建颜色

字体设置

资料获取方法


前言

众所周知,通过数据绘图,我们可以将枯燥的数字转换成容易被人们接受的图表,从而让人留下更加深刻的印象。而大多数编程语言都有自己的绘图工具,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
仿宋_GB2312FangSong_GB2312
楷体_GB2312KaiTi_GB2312

资料获取方法

【留言777】

各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值