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

12人阅读 评论(0) 收藏 举报
分类:

前言

通过数据绘图,我们可以将枯燥的数字转换成容易被人们接受的图表,从而让人留下更加深刻的印象。

matplotlib是基于numpy的一套Python工具包。这个包提供了丰富的数据绘图工具,主要用于绘制一些2D统计图形。它可以以各种硬拷贝格式在跨平台的交互式环境生成出版质量级别的图形。

通过 Matplotlib,可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图,甚至动态图等。

下面是他们官网的一些例子:

https://matplotlib.org/gallery

博主也是在测试一个算法的时候,想更直观的呈现数据走向,学习其相关的用法,此篇为学习记录。

安装

Matplotlib得安装比较容易,可以直接通过pip安装,也可以通过下载安装包的方式安装。

pip3.6 install matplotlib

也可以直接下载安装包进行安装,如果你的Python是其他版本,则点击其他matplotlib下载对应Python版本
matplotlib-1.4.3.win-amd64-py3.4.exe 其他matplotlib

柱状图

用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
import time
source_data = {'var': 369, 'plt': 192, 'sale': 115, 'a': 50, 'b': 45, 'c':      40, 'd': 35, 'e': 30, 'f': 25, 'g': 20,'h': 18, 'i': 16, 'j': 14, 'k':      10, 'l': 8, 'm': 7, 'n': 6, 'o': 6, 'p': 6, 'q': 6, 'r': 6, 's': 6,         't':      6, 'u': 6, 'v': 6,'w': 6, 'x': 6, 'y': 6, 'z': 6}  # 设置原始数据
labels = list(source_data.keys())  # 设置标签
fracs = [x for x in source_data.values()]
explode = [x*0.03 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。
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)

官方使用介绍:
https://matplotlib.org/api/animation_api.html#id4

示例代码:

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中对显示的字体和颜色都可以进行定制:

其他颜色可以参考下面的链接:
matplotlib的颜色及线条控制

相关资料:
https://blog.csdn.net/u010758410/article/details/71743225

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

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

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

查看评论

Excel图表实战视频课程【你学得会】

-
  • 1970年01月01日 08:00

解决Matplotlib绘制的图表不能正确显示中文

解决这个问题有两种方法,一种方法是修改配置文件,这种方法一劳永逸,以后不必担心中文显示的问题(重新安装Matplotlib除外),另一种方法是通过代码修改,比较局限,但步骤少点。...
  • u011008379
  • u011008379
  • 2016-05-15 21:51:54
  • 2323

【Python】Matplotlib画图(九)——饼图

Matplotlib画图(九)——饼图
  • roguesir
  • roguesir
  • 2017-10-08 22:59:09
  • 1058

关于使用python的matplotlib库做动态图

关于使用python的matplotlib库做动态图参考: * matplotlib绘制动画的示例,主要参考这个。 * python之matplotlib学习(三) 画动态更新图、 * 利用Py...
  • Rainloving
  • Rainloving
  • 2015-06-03 17:05:08
  • 10757

Matplotlib 饼状图中的文字中文乱码问题

摘要: 今天画饼状图出现中文乱码,用传统的文字乱码处理方法包括设置rcParams,修改matplotlibrc都没有解决,最后通过直接直接找到实例用set_fontproperties解决 ...
  • u010159842
  • u010159842
  • 2017-04-18 11:06:49
  • 1301

Python——使用matplotlib绘制柱状图

Python——使用matplotlib绘制柱状图 1、基本柱状图           首先要安装matplotlib 可以使用pip命令直接安装 # -*- coding: utf-8 -*- im...
  • qq_29721419
  • qq_29721419
  • 2017-05-11 17:05:18
  • 12148

matplotlib绘制直方图、条形图和饼图

matplotlib绘制直方图、条形图和饼图 matplotlib是一个非常强大的Python第三方绘图包,可以绘制非常多非常漂亮的图形。matplotlib.pyplot提供了一个类Matlab的...
  • hohaizx
  • hohaizx
  • 2018-01-18 22:02:33
  • 454

matplotlib模块数据可视化-绘制柱状图

1 柱状图 经常在数据显示的时候我们会使用柱状图,通常柱状图又包括两种,一种是竖直的,一种是水平的柱状图,现在我们来进行一一讲解和演示。 由于水平柱状图和竖直柱状图相似,参数差不多,个别参数名称不...
  • sinat_36772813
  • sinat_36772813
  • 2017-08-16 14:39:43
  • 4737

使用matplotlib绘制动态图

主要使用animation.FuncAnimation来实现,其中的参数 func是更新图形的函数,frames是总共更新的次数,intit_func是图形开始使用的函数, interval是更新的...
  • zhuzuwei
  • zhuzuwei
  • 2017-09-23 08:30:43
  • 1546

python 画图--饼图

python 画图--饼图 这是python画图系列第三篇--饼图 画饼图用到的方法为: matplotlib.pyplot.pie() 参数为: pie(x, explode=No...
  • jenyzhang
  • jenyzhang
  • 2016-07-27 18:35:54
  • 14062
    个人资料
    持之以恒
    等级:
    访问量: 1604
    积分: 293
    排名: 9万+
    文章存档
    最新评论