Matplotlib库
Matplotlib是一个python的2D绘图库,通过它可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。可以让数据可视化,使数据更加客观,具体。
安装matplotlib库
基本绘制
使用matplotlib绘制图形使,画点和画线是最常用的两个场景。
pyplot基本方法
绘制直线
1.导入模块pyplot,在模块pyplot中包含很多用于生产图表的函数。
2.将绘制的直线坐标传递给函数plot().
3.通过函数plt.show()打开Matplotlib查看器,显示绘制的图形。
例:根据两点绘制一条直线
1 2 3 4 5 6 7 8 9 10
| import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5] y = [1, 3, 5, 7, 9]
plt.plot(x, y)
plt.show()
|
设置标签文字和线条粗细
开发者可以设置线条的粗细,设置文字等。
例:绘制折线图并设置样式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5] y = [1, 4, 9, 16, 25]
plt.plot(x, y, linewidth=5)
plt.xlabel("x") plt.ylabel("y=x^2") plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.title("多个点绘制折线图")
plt.show()
|
matplotlib默认不支持中文,可以使用方法来解决显示中文:
1
| plt.rcParams["font.sans-serif"] = ["SimHei"]
|
绘制一元二次方程的曲线y=x^2
Matplotlib中plot函数用来绘制曲,需要将200个点的x坐标和y坐标分别以序列的形式传入plot函数,然后调用show函数显示绘制图形。
例:一元二次方程的曲线
1 2 3 4 5 6 7 8 9 10 11 12
| import matplotlib.pyplot as plt
x = range(-100, 100) y = [i**2 for i in x]
plt.plot(x, y)
plt.savefig("result")
plt.show()
|
绘制正弦曲线和余弦曲线
使用plt函数绘制任何曲线都是生成若干个坐标点(x,y),理论上坐标点越多越好。本例取0到10之间100个等差数作为x的坐标,将这100个x坐标值一起传入Mumpy的sin和cos函数,就会得到100个y坐标值,然后可以使用plot函数绘制正弦曲线和余弦曲线。
例:绘制正弦曲线和余弦曲线
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import matplotlib.pyplot as plt import numpy as np
x =np.linspace(0, 10, 100)
sin_y = np.sin(x) plt.plot(x, sin_y)
cos_y = np.cos(x) plt.plot(x, cos_y)
plt.show()
|
将画布分区
如果想绘制到两张画布中,可以调用subplot()函数将画布分区。
例:将画布分为区域,将图画绘制到画布指定区域
修改x,y轴坐标大小
1 2
| plt.xlim(-5, 15) plt.ylim(-2, 2)
|
绘制散点图
使用scatter函数可以绘制随机点,该函数需要接收x坐标和y坐标的序列。
例:sin函数的散点图
1 2 3 4 5 6 7 8 9 10
| import matplotlib.pyplot as plt import numpy as np
x =np.linspace(0, 10, 100)
plt.scatter(x, np.sin(x))
plt.show()
|
使用plot()也可以绘制散点图,最后加字符串o。
使用plot()绘制图形速度优于scatter(),所以如果画点没有形式差别,可以使用plot画,而如果画点有形式差别(如点的大小或颜色不同)则必须使用scatter()来画。
绘制大小不同颜色不同的散点图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import matplotlib.pyplot as plt import numpy as np
np.random.seed(0) x = np.random.rand(100) y = np.random.rand(100) size = np.random.rand(100)*1000
color = np.random.rand(100)
plt.scatter(x, y, s=size, c=color, alpha=0.7)
plt.show()
|
注意:点的个数和颜色的个数要相同;点的个数和点大小的个数可以不同,如果点的个数大于大小的个数,则超出点大小个数的会循环获取大小。
绘制不同样式不同颜色的线条
1 2 3 4 5 6 7 8 9 10 11 12
| import matplotlib.pyplot as plt import numpy as np
x =np.linspace(0, 10, 100) plt.plot(x, x+0, "--r") plt.plot(x, x+1, "-.b") plt.plot(x, x+2, ":g") plt.plot(x, x+3, ",k") plt.plot(x, x+4, "*c") plt.show()
|
增加图例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import matplotlib.pyplot as plt import numpy as np
x =np.linspace(0, 10, 100)
plt.plot(x, x+0, "--r", label="--r") plt.plot(x, x+1, "-.b", label="-.b") plt.plot(x, x+2, ":g", label=":g") plt.plot(x, x+3, ",k", label=",k") plt.plot(x, x+4, "*c", label="*c")
plt.legend(loc="upper left", fancybox=True, framealpha=0.8, shadow=True, borderpad=1)
plt.show()
|
- lengend参数:loc图例位置,fancybox边框,framealpha透明度,shadow阴影,borderpad边框宽度
绘制柱状图
可以使用bar函数绘制柱状图,柱状图需要水平的x坐标值,和每个x对应的y坐标值,形成柱状图。柱状图主要用来纵向对比和横向对比。
例:使用bar绘制柱状图,并设置柱的宽度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import matplotlib.pyplot as plt import numpy as np
x = [1990, 1995, 2000, 2005] y = [1000, 2000, 3000, 4000] x_label = ["1990年", "1995年", "2000年", "2005年"]
plt.bar(x, y, width=3)
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.xticks(x,x_label)
plt.xlabel("年份") plt.ylabel("数量")
plt.title("根据年份数量对比表") plt.show()
|
注意:bar函数的宽度不是像素宽度,bar函数会根据二维坐标系的尺寸,以及x坐标值的多少,自动确定每个柱的宽度,width指定的宽度就是这个标准柱宽度的倍数。该参数可以是浮点数或整数。
bar绘制垂直方向柱状图和barh绘制水平方向柱状图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import matplotlib.pyplot as plt import numpy as np
np.random.seed(0) x = np.arange(5) y = np.random.randint(-5, 5, 5)
plt.subplot(1, 2, 1) plt.bar(x, y, color="blue")
plt.axhline(0, color="blue", linewidth=1)
plt.subplot(1, 2, 2) plt.barh(x, y, color="red")
plt.axvline(0, color="red", linewidth=1) plt.show()
|
柱状图正负数值设置不同颜色柱
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import matplotlib.pyplot as plt import numpy as np
np.random.seed(0) x = np.arange(5) y = np.random.randint(-5, 5, 5)
plt.subplot(1, 2, 1) v_bar = plt.bar(x, y, color="blue")
for bar, height in zip(v_bar, y): if height > 0: bar.set(color="green")
plt.axhline(0, color="blue", linewidth=1) plt.show()
|
柱状图使用实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import matplotlib.pyplot as plt import numpy as np
real_names = ["我的姐姐", "哥斯拉大战金刚", "第十一回"]
real_num1 = [2947, 1562, 189] real_num2 = [2150, 1140, 225] real_num3 = [2602, 1290, 243] x = np.arange(len(real_names))
width = 0.3 plt.bar(x, real_num1, alpha=0.5, width=width, label=real_names[0]) plt.bar([i+width for i in x], real_num2, alpha=0.5, width=width, label=real_names[1]) plt.bar([i+width*2 for i in x], real_num3, alpha=0.5, width=width, label=real_names[2])
plt.rcParams["font.sans-serif"]=["SimHei"] x_label = ["第{}天".format(i+1) for i in x] plt.xticks([i+width for i in x], x_label)
plt.ylabel("票房数")
plt.legend(loc="upper right", fancybox=True, framealpha=0.8, shadow=True, borderpad=1) plt.show()
|
绘制饼状图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import matplotlib.pyplot as plt
man = 1733 woman = 1566 man_perc = man/(woman+man) woman_perc = woman/(woman+man)
plt.rcParams["font.sans-serif"]=["SimHei"]
labels = ["男", "女"]
colors = ["blue", 'pink']
paches, texts, autotexts = plt.pie([man_perc, woman_perc], labels=labels, colors=colors, explode=(0, 0.03), autopct="%0.2f%%")
for text in autotexts: text.set_color("white")
for text in texts: text.set_color("green")
for text in texts+autotexts: text.set_fontsize(16) plt.show()
|
绘制直方图
直方图与柱状图的分格类似,都是由若干个柱组成,但直方图和柱状图的含义不同,直方图使用来观察分布状态的,而柱状图是用来查看每个x坐标对应的y坐标值的。直方图关注的是分布,不关心具体的值,而柱状图关心的是具体的某个值。
例:使用randn函数生成1000个正太分布的随机数,使用hist函数绘制这1000个随机数的分布状态
1 2 3 4 5 6 7 8 9 10
| import matplotlib.pyplot as plt import numpy as np
x = np.random.randn(1000)
plt.hist(x, bins=100) plt.show()
|
使用narmal()也可以生成正态分布直方图
1 2 3 4 5 6 7 8 9 10 11 12 13
| import matplotlib.pyplot as plt import numpy as np
x = np.random.normal(0, 0.8, 1000) y = np.random.normal(-2, 1, 1000) z = np.random.normal(3, 2, 1000) kwargs=dict(bins=100, alpha=0.5) plt.hist(x, **kwargs) plt.hist(y, **kwargs) plt.hist(z, **kwargs) plt.show()
|
绘制等高线图
例:使用pylot绘制等高线图
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import matplotlib.pyplot as plt import numpy as np
x = np.linspace(-10, 10, 100) y = np.linspace(-10, 10, 100)
X, Y = np.meshgrid(x, y)
Z = np.sqrt(X**2+Y**2) plt.contour(X, Y, Z) plt.contourf(X,Y, Z) plt.show()
|
绘制三维图像
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
X = [1, 1, 2, 2] Y = [3, 4, 4, 3] Z = [1, 100, 1, 1] fig = plt.figure()
ax = Axes3D(fig) ax.plot_trisurf(X, Y, Z) plt.show()
|