matplotlib 介绍
Matplotlib是一个Python 2D绘图库,可以生成各种硬拷贝格式和跨平台交互式环境的出版物质量数据。Matplotlib可用于Python脚本,Python和IPython shell,Jupyter笔记本,Web应用程序服务器和四个图形用户界面工具包。
Matplotlib试图让简单易事的事情成为可能。你只需几行代码即可生成绘图,直方图,功率谱,条形图,误差图,散点图等。
对于简单的绘图,pyplot模块提供类似MATLAB的接口,特别是与IPython结合使用时。 对于高级用户,你可以通过面向对象的界面或通过MATLAB用户熟悉的一组函数完全控制线型,字体属性,轴属性等。
文档:https://www.matplotlib.org.cn/index.html
安装:
访问https://pypi.org/project/matplotlib/#files下载和python安装的对应版本
打开命令窗口,并切换到该项目文件夹,在使用pip来安装
python -m pip install --user matplotlib-3.1.1-cp37-cp37m-win32.whl
安装完成后打开python终端回话,尝试导入matplotlib
import matplotlib
这样则安装成功
下面部分是绘制图形
使用plot()绘制折线图:
import matplotlib.pyplot as plt
#创建一个列表
#对应数据,inp——values为x轴刻度尺,squares为y轴数据
input_values = [1, 2, 3, 4, 5]
squares = [1, 3, 5, 6, 20]
#将列表传递给函数plot,绘制图像,linewidth线条的粗细
plt.plot(input_values, squares, linewidth = 2)
#设置图表标题,并给坐标轴加上标签
plt.title("Square Numbers", fontsize = 24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
#设置刻度标记的大小axis='both'影响x轴y轴上的刻度,labelsize设置字号
plt.tick_params(axis='both', labelsize = 14)
#打开matplotlib查看器
plt.show()
效果图片:
使用scatter()来绘制单个点
import matplotlib.pyplot as plt
#使用scatter()来绘制单个点,前两个参数为坐标位置,s设置绘制图形时使用的点的尺寸
#设置坐标位置,两个列表
#x_values = [1, 2, 3, 4, 5]
#y_values = [1, 4, 9, 16, 25]
#循环绘制点,连接成线
x_values = list(range(1, 1001))
y_values = [x**2 for x in x_values]
#edgecolor删除节点轮廓,c='red'设置图颜色
#plt.scatter(x_values, y_values, c='red', edgecolor='none', s = 10)
#颜色映射,起始颜色渐变到结束颜色,c设置成一个y值列表,cmap告诉pyplot使用哪个颜色映射
plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, edgecolor='none', s = 10)
#设置图表标题并给坐标轴加上标签
plt.title("Square Numbers", fontsize=24)
plt.xlabel("value", fontsize = 24)
plt.ylabel("Square of value", fontsize=24)
#设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)
#设置每个坐标轴的取值范围
plt.axis([0, 1100, 0, 1100000])
plt.show()
#将图片保存到工作目录
#plt.savefig('squares_plot.png', bbox_inches = 'tight')
效果图:
绘制随机漫步图:
先创建一个RandwmWalk()类,他随机的选择前进方向
from random import choice
class RandomWalk():
"""一个生成随机漫步数据的类"""
#num_points设置默认点数
def __init__(self, num_points = 5000):
"""初始化随机漫步的属性"""
self.num_points = num_points
#所有随机漫步都始于(0, 0)
#创建了两个用于存储x和y值的列表,并让每次漫步都从点(0, 0)出发
self.x_values = [0]
self.y_values = [0]
def fill_walk(self):
"""计算随机漫步包含的所有点"""
#不断漫步,直到列表到达指定的长度
while len(self.x_values) < self.num_points:
#决定前进方向以及沿这个方向前进的距离
#1表示向右走的1,-1表示向左走的-1
x_direction = choice([1, -1])
#沿指定方向走多远,choice随机选择一个数字
x_distance = choice([0, 1, 2, 3, 4])
#移动方向乘以移动距离,确定沿x和y轴移动的距离,如果x_self为正将向右移动,为负向左移动
x_step = x_direction * x_distance
y_direction = choice([1, -1])
y_distance = choice([0, 1, 2, 3, 4])
y_step = y_direction * y_distance
#拒绝原地踏步
if x_step == 0 and y_step == 0:
continue
#计算下一个点的x和y值
next_x = self.x_values[-1] + x_step
next_y = self.y_values[-1] + y_step
self.x_values.append(next_x)
self.y_values.append(next_y)
生成简单的漫步图:
import matplotlib.pyplot as plt
from random_walk import RandomWalk
#创建一个RandomWalk实例,并将其包含的点都绘制出来
rw = RandomWalk()
rw.fill_walk()
#将随机漫步包含的x和y值传递给scatter(),并选择了合适的点尺寸
plt.scatter(rw.x_values, rw.y_values, s = 5)
plt.show()
生成效果:
给点设置渐变色:
#将所有点数生成一个数字列表
point_number = list(range(rw.num_points))
#将随机漫步包含的x和y值传递给scatter(),并选择了合适的点尺寸
#edgecolor='none'删除每个点周围的轮廓,给点着色
plt.scatter(rw.x_values, rw.y_values, c=point_number, cmap=plt.cm.Blues, edgecolor='none', s = 5)
突出终点和起点:
#突出起点和终点
plt.scatter(0, 0, c = 'green', edgecolors = 'none', s = 100)
plt.scatter(rw.x_values[-1], rw.y_values[-1], c = 'red', edgecolors = 'none', s = 100)
英寸坐标轴:
#隐藏坐标轴
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
调整图表大小:
plt.figure(figsize=(10, 6))
完整代码:
import matplotlib.pyplot as plt
from random_walk import RandomWalk
#创建一个RandomWalk实例,并将其包含的点都绘制出来
rw = RandomWalk()
rw.fill_walk()
#设置绘图窗口的尺寸,figure()用于指定图表的宽度和高度,分辨率和背景色,指出绘图窗口的尺寸,单位英寸
plt.figure(figsize=(10, 6))
#将所有点数生成一个数字列表
point_number = list(range(rw.num_points))
#将随机漫步包含的x和y值传递给scatter(),并选择了合适的点尺寸
#edgecolor='none'删除每个点周围的轮廓,给点着色
plt.scatter(rw.x_values, rw.y_values, c=point_number, cmap=plt.cm.Blues, edgecolor='none', s = 5)
#突出起点和终点
plt.scatter(0, 0, c = 'green', edgecolors = 'none', s = 100)
plt.scatter(rw.x_values[-1], rw.y_values[-1], c = 'red', edgecolors = 'none', s = 100)
#隐藏坐标轴
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
plt.show()
效果图:
直方图——掷骰子案例首先需要安装一下pygal
同样的需要在项目目录中使用pip安装,这里我的项目目录为:E:\2019mcy\pythonWord\matplotlib
python -m pip install --user pygal==1.7
之后创建一个die.py文件,里边存放一个Die()类,骰子的属性类
from random import randint
class Die():
"""表示一个骰子的类"""
def __init__(self, num_sides=6):
"""骰子默认为6面"""
self.num_sides = num_sides
def roll(self):
"""返回一个位于1和骰子面数之间的随机值"""
return randint(1, self.num_sides)
之后模拟掷骰子,分析和结果,统计没一面出现的次数,结果使用直方图进行统计出来
from die import Die
import pygal
#创建一个D6
die = Die()
#掷几次骰子,并将结果存储在一个列表中
results = []
for roll_num in range(100):
result = die.roll()
results.append(result)
#分析结果
frequencies = []
for value in range(1, die.num_sides+1):
#计算每种点数在results中出现了多少次
frequency = results.count(value)
frequencies.append(frequency)
#对结果进行可视化
hist = pygal.Bar()
#嘴上方标题
hist.title = "Results of rolling one D6 100 times."
#x轴标签,和x,y轴标题
hist.x_labels = ['1', '2', '3', '4', '5', '6']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"
#将一系列值添加到图表中
hist.add('D6', frequencies)
#生成svg文件存放在和文件同一目录,可以在浏览器中打开查看
hist.render_to_file('die_visual.svg')
效果图:
同时掷两个面数不同的骰子:
只需是多创建一个Die实例,把骰子面数传递过去,掷骰子是,把两个骰子的面数相加放入列表中,分析结果会有两个骰子面数相加种结果
x轴坐标需要改变一下,具体代码如下:
from die import Die
import pygal
#创建一个D6
die = Die()
die2 = Die(10)
#掷几次骰子,并将结果存储在一个列表中
results = []
for roll_num in range(100):
result = die.roll()+die2.roll()
results.append(result)
#分析结果
frequencies = []
max_result = die.num_sides+die2.num_sides
for value in range(2, max_result+1):
#计算每种点数在results中出现了多少次
frequency = results.count(value)
frequencies.append(frequency)
#对结果进行可视化
hist = pygal.Bar()
#嘴上方标题
hist.title = "Results of rolling a D6 and a D10 100 times."
#x轴标签,和x,y轴标题
hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"
#将一系列值添加到图表中
hist.add('D6+D10', frequencies)
#生成svg文件存放在和文件同一目录,可以在浏览器中打开查看
hist.render_to_file('die_visual.svg')
效果图: