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

您所在的位置:网站首页 数据怎么变成圆饼圆柱 【Python】模块学习之matplotlib柱状图、饼状图、动态图及解决中文显示问题

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

2024-04-13 17:34| 来源: 网络整理| 查看: 265

通过数据绘图,我们可以将枯燥的数字转换成容易被人们接受的图表,从而让人留下更加深刻的印象。通过 Matplotlib,可以仅需要几行代码便生成各种图形的绘制。本文主要介绍柱状图、饼图和动态图的用法,及解决中文展示问题。 前言

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

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

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

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

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

matplotlib的颜色及线条控制 字体设置 字体 对应字体 黑体 SimHei 微软雅黑 Microsoft YaHei 微软正黑体 Microsoft JhengHei 新宋体 NSimSun 新细明体 PMingLiU 细明体 MingLiU 标楷体 DFKai-SB 仿宋 FangSong 楷体 KaiTi 仿宋_GB2312 FangSong_GB2312 楷体_GB2312 KaiTi_GB2312

参考资料:

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

文中可能存在描述不正确,欢迎大神们指正补充! 感谢阅读,如果觉得对你有帮助,就在右下角点个赞吧,感谢!

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3