Matplotlib随记2

之前写了很多关于Matplotlib的基础知识,这次主要讲一下Matplotlib所生成的几个图:散点图,柱状图,等高线图,图片和3D数据

Scatter散点图

在制作Scatter散点图的过程中,我们首先要引入matplotlib.pyplot简写为plt,再引入模块numpy用来产生一些随机的数据。生成1024个呈正态分布的二维数组(平均数是0,方差是1)作为一个数据集,并图像化这个数据集。其中,每一个点的颜色用T来表示:

import matplotlib.pyplot as plt
import numpy as np

n=1024   #数据大小
X=np.random.normal(0,1,n)   #每一个点的X值
Y=np.random.normal(0,1,n)   #
T=np.arctan2(Y,X)

数据生成完毕之后,我们需要采用scatter来绘制这些点。在这里,我们输入X和Y作为输入点,颜色为T,color map用作默认值,透明度alpha为50%。X轴显示范围定位为(-1.5,1.5),并用xtick()函数来隐藏x坐标轴,ytick()函数来隐藏y坐标轴

plt.scatter(X,Y,s=75,c=T,alpha=.5)

plt.xlim(-1.5,1.5)
plt.xticks(())
plt.ylim(-1.5,1.5)
plt.yticks(())

plt.show()

综上,该代码最终产生的结果为:

柱状图

在我们平时的机器学习领域中,柱状图通常有很大的作用,它可以很形象的看到趋势的变化。下面就介绍一下如何利用matplotlib来生成一个柱状图。

首先第一步便是生成数据。我们向上向下分别生成12个数据,X为0到11的整数,Y是相应的均匀分布的随机数据。使用的函数是plt.bar,参数是X和Y:

import matplotlib.pyplot as plt
import numpy as np

n=12
X=np.arange(n)
Y1=(1 - X / float(n)) * np.random.uniform(0.5,1.0,n)
Y2=(1 - X / float(n)) * np.random.uniform(0.5,1.0,n)

plt.bar(X,+Y1)
plt.bar(X,-Y2)
plt.xlim(-1,n)
plt.xticks(())
plt.ylim(-1.25,1.25)
plt.yticks(())

plt.show()

 

这样我们便可以生成柱状图的基本框架。下一步我们需要对该图就颜色和数值进行优化。用facecolor设置主题颜色,edgecolor设置边框颜色。

plt.bar(X,+Y1,facecolor='#9999ff',edgecolor='white')
plt.bar(X,-Y2,facecolor='#ff9999',edgecolor='white')

 

接下来我们用函数plt.text分别在柱体上方(下方)加上数值,用%.2f 保留两位小数,横向居中对齐ha='center',纵向底部(顶部)对齐va='bottom'

for x,y in zip(X,Y1):
    plt.text(x+0.4,y+0.05,'%.2f' % y,ha='center',va='bottom')

for x,y in zip(X,Y2):
    plt.text(x+0.4,-y-0.05,'%.2f' % y,ha='center',va='bottom')

 

综上,本部分的所有代码为:

import matplotlib.pyplot as plt
import numpy as np

n=12
X=np.arange(n)
Y1=(1 - X / float(n)) * np.random.uniform(0.5,1.0,n)
Y2=(1 - X / float(n)) * np.random.uniform(0.5,1.0,n)

plt.bar(X,+Y1,facecolor='#9999ff',edgecolor='white')
plt.bar(X,-Y2,facecolor='#ff9999',edgecolor='white')


for x,y in zip(X,Y1):
    plt.text(x+0.4,y+0.05,'%.2f' % y,ha='center',va='bottom')

for x,y in zip(X,Y2):
    plt.text(x+0.4,-y-0.05,'%.2f' % y,ha='center',va='bottom')

plt.xlim(-1,n)
plt.xticks(())
plt.ylim(-1.25,1.25)
plt.yticks(())

plt.show()

 

所产生的结果为:

 

等高线图

在本部分,我们主要介绍如何利用matplotlib生成等高线。在生成等高线中,我们需要三维的数据点:(x,y)和对应的高度。在本程序中,高度我们用一个函数f()来生成。x,y分别是在区间[-3,3]中均匀分布的256个值,并用meshgrid在二维平面中将每一个x和每一个y分别对应起来,编织成栅格:

import matplotlib.pyplot as plt
import numpy as np

def f(x,y):
    return (1 - x/2 + x**5 + y**3) * np.exp(-x**2,-y**2)

n=256
x=np.linspace(-3,3,n)
y=np.linspace(-3,3,n)
X,Y=np.meshgrid(x,y)

 

接下来我们进行颜色填充。使用函数plt.contourf把颜色加进去,位置参数分别为:X,Y,f(X,Y)。透明度0.75,并将f(X,Y)的值对应到color map的暖色组中寻找对应颜色。

plt.contourf(X,Y,f(X,Y),8,alpha=0.75,cmap=plt.cm.hot)

 

接下来进行等高线绘制。使用plt.contour函数划线。位置参数为 X,Y,f(X,Y)。在我们这里,我们将颜色选为黑色,线条宽度为0.5.现在的结果如下图所示:只有颜色和线条,没有数值Label

C=plt.contour(X,Y,f(X,Y),8,colors='black',linewidth=0.5)

 

在上面的代码中,我们可以看到,其中的8代表等高线的密集程度,这里被分为10个部分。如果是0,则图像被一分为二。

再下一步,我们需要添加高度数字。我们加入Label,inline控制是否在Label画在线里面,字体大小为10.并将坐标轴隐藏:

plt.clabel(C,inline=True,fontsize=10)
plt.xticks(())
plt.yticks(())

 

所以,在画等高线的所有代码为:

import matplotlib.pyplot as plt
import numpy as np

def f(x,y):
    return (1 - x/2 + x**5 + y**3) * np.exp(-x**2,-y**2)

n=256
x=np.linspace(-3,3,n)
y=np.linspace(-3,3,n)
X,Y=np.meshgrid(x,y)

plt.contourf(X,Y,f(X,Y),8,alpha=0.75,cmap=plt.cm.hot)
C=plt.contour(X,Y,f(X,Y),8,colors='black',linewidth=0.5)

plt.clabel(C,inline=True,fontsize=10)
plt.xticks(())
plt.yticks(())
plt.show()

 

所产生的结果为:

3D数据

在做机器学习的时候,有时候需要绘3D图片来看数据整体的下降趋势。首先在进行3D时除了导入matplotlib,还需要添加一个模块,即3D坐标轴显示,这个包不需要单独安装,python本身就自带的

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

 

之后要定义一个图像窗口,在窗口上添加3D坐标轴。

fig=plt.figure()
ax=Axes3D(fig)

 

接下来再给出X值和Y值,并将X值和Y值编织成栅格。每一个(X,Y)点对应的高度值,我们用下面这个函数进行计算:

X=np.arange(-4,4,0.25)
Y=np.arange(-4,4,0.25)
X,Y=np.meshgrid(X,Y)
R=np.sqrt(X ** 2 + Y ** 2)
Z=np.sin(R)

 

下一步我们需要做出一个三维曲面,并将一个colormap rainbow填充颜色,之后将三维图像投影到XY平面做一个等高线图。plot 3D 图像:

ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))

 

其中,rstride 和 cstride分别代表row 和 column的跨度

之后,我们添加XY平面的等高线:

ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap=plt.get_cmap('rainbow'))

 

如果zdir选择了x,那么效果将会是对于XZ平面的投影。

因此,整个项目的代码为:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig=plt.figure()
ax=Axes3D(fig)

X=np.arange(-4,4,0.25)
Y=np.arange(-4,4,0.25)
X,Y=np.meshgrid(X,Y)
R=np.sqrt(X ** 2 + Y ** 2)
Z=np.sin(R)

ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))

ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap=plt.get_cmap('rainbow'))

plt.show()

 

最终的效果图为:

 

本知识学自于:莫烦python

 

posted @ 2017-09-18 22:04  根叔  阅读(9153)  评论(0编辑  收藏  举报