目录
绘制基础
点线绘制
柱状图
饼状图
直方图
三维图
Matplotlib是一个Python的2D 绘图库。通过Matplotib, 开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。Matplotib,可让数据可视化,更直观的真实给用户。使数据更加客观、更具有说服力。Matplotlib 是Python的库,又是开发中常用的库。
matplotlib开发环境搭建:如果使用的是Anaconda Python开发环境,那么Matplotib己经被集成进Anaconda,并不需要单独安装。如果使用的是标准的Python开发环境则需安装:pip install matplotlib,Matplotlib官方网站:Matplotlib — Visualization with Python
绘制基础
在使用Matplotlib绘制图形时,其中有两个最为常用的场景。一个是画点,一个是画线。pyplot基本方法的使用如下表:
点线绘制
使用plot和scatter绘制出来的图形没有区别,但使用plot绘制图形的速度优于scatter。如果画一堆点,而且点的形式没有差别,则使用plot;如果点的形式有差别(指点的大小和颜色不同)则必须使用scatter。线的形状和颜色:
import matplotlib.pyplot as pltimport numpy as np
def zhixian():
plt.plot([2, 5, ], [7, 9]) # 绘制直线
def zhexian():
x = range(-50, 51)
y = [i ** 3 for i in x]
plt.plot(x, y, linewidth=5) # linewidth线条粗细参数
plt.title('一元三次方程坐标图', fontsize=24) # 图标标题
plt.xlabel('x值', fontsize=12) # x坐标轴标签
plt.ylabel('y值:x^3', fontsize=12) # y坐标轴标签
plt.rcParams['font.sans-serif'] = ['SimHei'] # matplotlib默认不支持中文,解决正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 解决负坐标不显示的问题
plt.savefig('一元三次图.jpg') # 保存图片,不指定图片格式时默认保存为.png格式
def zyxtest(model=0):
x = np.linspace(0, 10, 100) # 生成1-10之间的100个等差数列
sin_y = np.sin(x)
cos_y = np.cos(x)
if model == 0: # 如果是0,线条绘制到同一个坐标中
plt.plot(x, sin_y) # 绘制正弦曲线
plt.plot(x, cos_y) # 绘制余弦曲线
else: # 划分区域绘制 subplot参数:划分的行数,划分的列数,所在行列的区域位置(第几块位置)
plt.subplot(2, 3, 1)
plt.plot(x, sin_y)
plt.subplot(2, 3, 5)
plt.plot(x, cos_y)
def change_xy():
x = range(-10, 11)
y = [i ** 2 for i in x]
plt.xlim(-20, 20) # 修改x轴坐标
plt.ylim(-120, 120) # 修改y轴坐标
plt.plot(x, y)
def Scatter():
x = np.linspace(0, 10, 100)
sin_y = np.sin(x)
# plt.scatter(x,sin_y) # 散点图
plt.plot(x, sin_y, 'o') # 指定点的种类画散点图
def random_Scatter():
#注意:点的个数和颜色的个数要相同。点的个数和点大小的个数可以不同,如果点的个数大于大小的个数,则会循环获取大小
np.random.seed(0) # 执行多次,每次获取同样的随机数
x = np.random.rand(100)
y = np.random.rand(100)
size = np.random.rand(100) * 300
color = np.random.rand(100)
plt.scatter(x, y, s=size, c=color,alpha=0.8)
if __name__ == '__main__':
random_Scatter()
plt.show()import matplotlib.pyplot as plt# 设置线条颜色样式和图例
x = range(1, 11)
y1, y2, y3 = [i for i in x], [i + 1 for i in x], [i + 2 for i in x]
plt.plot(x, y1, 'or', label='红色点') # label图例名
plt.plot(x, y2, '*g', label='绿色*')
plt.plot(x, y3, ':y', label='黄虚线')
# 添加图例右下角lower right(左上角upper left);边框;透明度;阴影;边框宽度
plt.legend(loc='lower right', fancybox=True, framealpha=0.1, shadow=True, borderpad=1)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.show()
柱状图
使用bar函数绘制柱状图,柱状图需要水平的x坐标值,以及每一个x坐标值对应的y坐标值,从而形成柱状的图,柱状图主要用来纵向对比和横向对比。需要注意的是bar函数的宽度并不是像素宽度。bar 函数会根据二维坐标系的尺寸,以及x坐标值的多少,自动确定每一个柱的宽度,而widh指定的宽度就是这个标准柱宽度的倍数。该参数值可以是浮点数,如0.5, 表示柱的宽度是标准宽度的0.5倍。
import matplotlib.pyplot as plt
def bartest():
x = ['第一季度', '第二季度', '第三季度', '第四季度']
y = [-1011, 1500, -1390, 1280]
br = plt.bar(x, y, width=0.3) # width修改柱状图的宽度
# plt.xticks(x1,x2) # 修改x坐标轴的值,参数为原来的值和新值
# plt.yticks(y1,y2) # 修改y坐标轴的值
plt.axhline(0, color='red', linewidth=2) # 添加分割线,0表示y=0的直线
for bar, width in zip(br, y): # 通过判断正负显示不同颜色
if width < 0:
bar.set(color='yellow')
def barhtest():
x = ['第一季度', '第二季度', '第三季度', '第四季度']
y = [-1011, 1500, -1390, 1280]
bh = plt.barh(x, y, height=0.3) # width修改柱状图的宽度
plt.axvline(0, color='yellow', linewidth=2) # 添加分割线,0表示x=0的直线
for bar, height in zip(bh, y):
if height < 0:
bar.set(color='green')
if __name__ == '__main__':
plt.subplot(2, 2, 1)
bartest()
plt.subplot(2, 2, 4)
barhtest()
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.show()import matplotlib.pyplot as plt
import numpy as np
def test():
x = [1, 2, 3, 4]
y1 = np.random.randint(100, 500, size=4)
y2 = np.random.randint(100, 500, size=4)
y3 = np.random.randint(100, 500, size=4)
width = 0.2
plt.bar(x, y1, alpha=0.5, width=width, label='季度第一月')
plt.bar([i + width for i in x], y2, alpha=0.5, width=width, label='季度第二月')
plt.bar([i + width * 2 for i in x], y3, alpha=0.5, width=width, label='季度第三月')
x_label = ['第{}季度'.format(i) for i in x]
plt.xticks([i + width for i in x], x_label)
plt.ylim(0, 650)
if __name__ == '__main__':
test()
plt.legend()
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.show()
饼状图
import matplotlib.pyplot as plt
def bingtu():
python = 10.95
c = 11.62
java = 11.17
vb = 4.5
other = (100 - python - c - java - vb)
labels = ['python', 'c', 'java', 'vb', 'other']
# colors = ['']
# labels:名称、colors:颜色、explode:分裂、autopct:显示百分比
paches, texts, autotexts = plt.pie([python, c, java, vb, other], labels=labels, explode=[0.1, 0, 0, 0, 0],
autopct='%0.1f%%')
for text in autotexts:
text.set_color('white') # 设置饼状图的字体颜色
text.set_fontsize(10)
for text in texts:
text.set_fontsize(20) # 设置饼状图的字体大小
if __name__ == '__main__':
bingtu()
plt.show()
直方图
使用hist函数绘制直方图,直方图与柱状图的分格类似,都是由若干个柱组成,但直方图和柱状图的含义却有很大的差异。直方图是用来观察分布状态的,而柱状图是用来看每一个X坐标对应的Y的值的。也就是说,直方图关注的是分布并不关心具体的某个值,而柱状图关心的是具体的某个值。
import matplotlib.pyplot as plt
import numpy as np
def zft1():
x = np.random.randn(1000)
plt.hist(x, bins=100) # bins修改柱的宽度
def zft2():
# 正态分布直方图
x, y, z = np.random.normal(0, 0.8, 1000), np.random.normal(-2, 1, 1000), np.random.normal(1, 2, 1000)
kwargs = dict(bins=100, alpha=0.5)
plt.hist(x, **kwargs)
plt.hist(y, **kwargs)
plt.hist(z, **kwargs)
def dgx():
x = np.linspace(-10, 10.100)
y = np.linspace(-10, 10, 100)
# 计算x和y的相交点a
X, Y = np.meshgrid(x, y)
# 计算Z的坐标
Z = np.sqrt(X ** 2 + Y ** 2)
plt.contourf(X, Y, Z)
# plt.contour(X, Y, Z)
# 颜色越深表示值越小,中间的黑色表示z=0.
if __name__ == '__main__':
dgx()
plt.show()
三维图
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 创建X、Y、Z坐标
X = [10, 8, 4, 7]
Y = [5, 4, 4, 3]
Z = [10, 100, 50, 45]
fig = plt.figure()
# 创建一个Axes3D子图放到figure画布里面
ax = Axes3D(fig)
ax.plot_trisurf(X, Y, Z)
plt.show()