python数据分析(四)--Matplotlib

参考:给深度学习入门者的Python快速教程 - Numpy和Matplotlib篇

  1. 简单的y折线图(x为y对应元素的索引)

    import matplotlib.pyplot as plt
    
    plt.plot([3,1,4,5,2])
    plt.ylabel('Grade')
    plt.show()
    
  2. 将生成的图像存成图片:使用命令:plt.savefig('test', dpi=600)
    其中默认格式为png格式,可以通过dpi修改输出质量

  3. 建立x-y坐标图

    plt.plot([0,2,4,6,8], [12,1,4,5,2])
    plt.ylabel('Grade')
    plt.axis([0,10,0,12])
    plt.show()
    

plt.axis([x1,x2,y1,y2])--图像的范围
简单实例:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# 通过rcParams设置全局横纵轴字体大小
mpl.rcParams['xtick.labelsize'] = 24
mpl.rcParams['ytick.labelsize'] = 24

np.random.seed(42)

# x轴的采样点
x = np.linspace(0, 5, 100)

# 通过下面曲线加上噪声生成数据,所以拟合模型就用y了……
y = 2*np.sin(x) + 0.3*x**2
y_data = y + np.random.normal(scale=0.3, size=100)

# figure()指定图表名称
plt.figure('data')

# '.'标明画散点图,每个散点的形状是个圆
plt.plot(x, y_data, '.')

# 画模型的图,plot函数默认画连线图
plt.figure('model')
plt.plot(x, y)

# 两个图画一起
plt.figure('data & model')

# 通过'k'指定线的颜色,lw指定线的宽度
# 第三个参数除了颜色也可以指定线形,比如'r--'表示红色虚线
# 更多属性可以参考官网:http://matplotlib.org/api/pyplot_api.html
plt.plot(x, y, 'k', lw=3)

# scatter可以更容易地生成散点图
plt.scatter(x, y_data)

# 将当前figure的图保存到文件result.png
plt.savefig('result.png')

# 一定要加上这句才能让画好的图显示在屏幕上
plt.show()
  1. 简单子绘图区域
    plt.subplot(nrows,ncols,plot_number)
    例如:

    def f(t):
        return np.exp(-t)*np.cos(2*np.pi*t)
    
    a=np.arange(0,5.0,0.02)
    
    plt.subplot(211)
    
    plt.plot(a,f(a))
    
    plt.subplot(2,1,2)
    
    plt.plot(a,np.cos(2*np.pi*a),'r--')
    plt.show()
    

    结果如图所示:


  2. 多条曲线的绘制
    使用语法:plt.plot(x,y,format_string,**kwargs)
    多条曲线:
    plt.plot(a,a*1.5,a,a*2.5,a,a*3.5,a,a*4.5)
    format_string:


    线条风格字符:

    坐标标记字符:
    标记字符

  3. 中文显示

    • 方法一:全局修改:使用rcParams修改字体实现
      例如:matplotlib.rcParams['font.family']='SimHei' 设为黑体
      Kaiti 中文楷体 Lisu 中文隶书 Fangsong 中文仿宋 YouYuan 中文幼圆 STSong 华文宋体
      之后就可以在图像上显示中文plt.ylabel("纵轴(值)")
      rcParams属性:font.family font.style ('normal' or 'italic') font.size (数字
      or 'large' 'x-small')
    • 方法二:在有中文输出的地方,只增加一个属性:fontproperties
      例如:plt.xlable('横轴:时间',fontproperties=‘SimHei’,fontsize=20,color=‘green’)
  4. 文本显示函数

    文本显示

    例如: plt.text(2,1,r'$\mu=100$',fontsize=15)

    • 显示表格:plt.grid(True)
    • 箭头注解:plt.annotate(s,xy=arrow_crd,xytext=text_crd,arrowprops=dict)
      例如:plt.annotate(r'$\mu=100$',xy=(2,1),xytext=(3,1.5),arrowprops=dict(facecolor='black',shrink=0.1,width=2))
  5. 复杂子区域绘图

    1. plt.subplot2grid()
      说明:plt.subplot2grid(GridSpec,CurSpec,colspan=1,rowspan=1)
      例如:
      plt.subplot2grid((3,3),(0,0),colspan=3)
      plt.subplot2grid((3,3),(1,0),colspan=2)
      plt.subplot2grid((3,3),(1,2),rowspan=2)
      plt.subplot2grid((3,3),(2,0))
      plt.subplot2grid((3,3),(2,1))
      

      分割之后的图像为:
      image.png
    2. 'gridspec'
      用法:
      import matplotlib.gridspec as gridspec
      gs=gridspec.GridSpec(3,3)
      ax1=plt.subplot(gs[0,:])
      ax2=plt.subplot(gs[1,:-1])
      ax3=plt.subplot(gs[1:,-1])
      ax4=plt.subplot(gs[2,0])
      ax5=plt.subplot(gs[2,1])
      
      图像结果如上图所示
  6. matplotlib绘制图形类型
    1
    2
    3
    1. 饼图绘制
      代码示例:

      import matplotlib.pyplot as plt
      labels = ['Frogs', 'Hogs', 'Dogs', 'Logs']
      sizes = [15, 30, 45,10]
      explode=(0,0.1,0,0)
      plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%', shadow=False,startangle=90)
      plt.axis('equal')
      plt.show()
      

      图像如下:
    2. 直方图的绘制

      np.random.seed(0)
      mu, sigma=100,20
      a= np.random.normal(mu,sigma,size=100)  #100:a数组的个数
      plt.hist(a,40,normed=1,histtyype='stepfilled',facecolor='b',alpha=0.75)
      # 40:区间的个数,normed=1将出现的次数归一化为概率
      plt.title('Histogram')
      
      plt.show()
      

      图像如下:
    3. 极坐标:
    4. 散点图-第一种:使用plot绘制
      第二种:面向对象
      代码如下:

      fig,ax=plt.subplots()
      ax.plot(10*np.random.randn(100),10*np.random.randn(100), 'o')
      ax.set_title('Simple Scatter')
      plt.show()
      
  7. 实例2

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
 
mpl.rcParams['axes.titlesize'] = 20
mpl.rcParams['xtick.labelsize'] = 16
mpl.rcParams['ytick.labelsize'] = 16
mpl.rcParams['axes.labelsize'] = 16
mpl.rcParams['xtick.major.size'] = 0
mpl.rcParams['ytick.major.size'] = 0
 
# 包含了狗,猫和猎豹的最高奔跑速度,还有对应的可视化颜色
speed_map = {
    'dog': (48, '#7199cf'),
    'cat': (45, '#4fc4aa'),
    'cheetah': (120, '#e1a7a2')
}
 
# 整体图的标题
fig = plt.figure('Bar chart & Pie chart')
 
# 在整张图上加入一个子图,121的意思是在一个1行2列的子图中的第一张
ax = fig.add_subplot(121)
ax.set_title('Running speed - bar chart')
 
# 生成x轴每个元素的位置
xticks = np.arange(3)
 
# 定义柱状图每个柱的宽度
bar_width = 0.5
 
# 动物名称
animals = speed_map.keys()
 
# 奔跑速度
speeds = [x[0] for x in speed_map.values()]
 
# 对应颜色
colors = [x[1] for x in speed_map.values()]
 
# 画柱状图,横轴是动物标签的位置,纵轴是速度,定义柱的宽度,同时设置柱的边缘为透明
bars = ax.bar(xticks, speeds, width=bar_width, edgecolor='none')
 
# 设置y轴的标题
ax.set_ylabel('Speed(km/h)')
 
# x轴每个标签的具体位置,设置为每个柱的中央
ax.set_xticks(xticks+bar_width/2)
 
# 设置每个标签的名字
ax.set_xticklabels(animals)
 
# 设置x轴的范围
ax.set_xlim([bar_width/2-0.5, 3-bar_width/2])
 
# 设置y轴的范围
ax.set_ylim([0, 125])
 
# 给每个bar分配指定的颜色
for bar, color in zip(bars, colors):
    bar.set_color(color)
 
# 在122位置加入新的图
ax = fig.add_subplot(122)
ax.set_title('Running speed - pie chart')
 
# 生成同时包含名称和速度的标签
labels = ['{}\n{} km/h'.format(animal, speed) for animal, speed in zip(animals, speeds)]
 
# 画饼状图,并指定标签和对应颜色
ax.pie(speeds, labels=labels, colors=colors)
 
plt.show()

在这段代码中又出现了一个新的东西叫做,一个用ax命名的对象。在Matplotlib中,画图时有两个常用概念,一个是平时画图蹦出的一个窗口,这叫一个figure。Figure相当于一个大的画布,在每个figure中,又可以存在多个子图,这种子图叫做axes。顾名思义,有了横纵轴就是一幅简单的图表。在上面代码中,先把figure定义成了一个一行两列的大画布,然后通过fig.add_subplot()加入两个新的子图。subplot的定义格式很有趣,数字的前两位分别定义行数和列数,最后一位定义新加入子图的所处顺序,当然想写明确些也没问题,用逗号分开即可。。上面这段代码产生的图像如下:


image
  1. 3D图表
    Matplotlib中也能支持一些基础的3D图表,比如曲面图,散点图和柱状图。这些3D图表需要使用mpl_toolkits模块,先来看一个简单的曲面图的例子
import matplotlib.pyplot as plt
import numpy as np
 
# 3D图标必须的模块,project='3d'的定义
from mpl_toolkits.mplot3d import Axes3D     
 
np.random.seed(42)
 
n_grids = 51            # x-y平面的格点数 
c = n_grids / 2         # 中心位置
nf = 2                  # 低频成分的个数
 
# 生成格点
x = np.linspace(0, 1, n_grids)
y = np.linspace(0, 1, n_grids)
 
# x和y是长度为n_grids的array
# meshgrid会把x和y组合成n_grids*n_grids的array,X和Y对应位置就是所有格点的坐标
X, Y = np.meshgrid(x, y)
 
# 生成一个0值的傅里叶谱
spectrum = np.zeros((n_grids, n_grids), dtype=np.complex)
 
# 生成一段噪音,长度是(2*nf+1)**2/2
noise = [np.complex(x, y) for x, y in np.random.uniform(-1,1,((2*nf+1)**2/2, 2))]
 
# 傅里叶频谱的每一项和其共轭关于中心对称
noisy_block = np.concatenate((noise, [0j], np.conjugate(noise[::-1])))
 
# 将生成的频谱作为低频成分
spectrum[c-nf:c+nf+1, c-nf:c+nf+1] = noisy_block.reshape((2*nf+1, 2*nf+1))
 
# 进行反傅里叶变换
Z = np.real(np.fft.ifft2(np.fft.ifftshift(spectrum)))
 
# 创建图表
fig = plt.figure('3D surface & wire')
 
# 第一个子图,surface图
ax = fig.add_subplot(1, 2, 1, projection='3d')
 
# alpha定义透明度,cmap是color map
# rstride和cstride是两个方向上的采样,越小越精细,lw是线宽
ax.plot_surface(X, Y, Z, alpha=0.7, cmap='jet', rstride=1, cstride=1, lw=0)
 
# 第二个子图,网线图
ax = fig.add_subplot(1, 2, 2, projection='3d')
ax.plot_wireframe(X, Y, Z, rstride=3, cstride=3, lw=0.5)
 
plt.show()
image
import matplotlib.pyplot as plt
import numpy as np
 
from mpl_toolkits.mplot3d import Axes3D
 
np.random.seed(42)
 
# 采样个数500
n_samples = 500
dim = 3
 
# 先生成一组3维正态分布数据,数据方向完全随机
samples = np.random.multivariate_normal(
    np.zeros(dim),
    np.eye(dim),
    n_samples
)
 
# 通过把每个样本到原点距离和均匀分布吻合得到球体内均匀分布的样本
for i in range(samples.shape[0]):
    r = np.power(np.random.random(), 1.0/3.0)
    samples[i] *= r / np.linalg.norm(samples[i])
 
upper_samples = []
lower_samples = []
 
for x, y, z in samples:
    # 3x+2y-z=1作为判别平面
    if z > 3*x + 2*y - 1:
        upper_samples.append((x, y, z))
    else:
        lower_samples.append((x, y, z))
 
fig = plt.figure('3D scatter plot')
ax = fig.add_subplot(111, projection='3d')
 
uppers = np.array(upper_samples)
lowers = np.array(lower_samples)
 
# 用不同颜色不同形状的图标表示平面上下的样本
# 判别平面上半部分为红色圆点,下半部分为绿色三角
ax.scatter(uppers[:, 0], uppers[:, 1], uppers[:, 2], c='r', marker='o')
ax.scatter(lowers[:, 0], lowers[:, 1], lowers[:, 2], c='g', marker='^')
 
plt.show()

这个例子中,为了方便,直接先采样了一堆3维的正态分布样本,保证方向上的均匀性。然后归一化,让每个样本到原点的距离为1,相当于得到了一个均匀分布在球面上的样本。再接着把每个样本都乘上一个均匀分布随机数的开3次方,这样就得到了在球体内均匀分布的样本,最后根据判别平面3x+2y-z-1=0对平面两侧样本用不同的形状和颜色画出,图像如下:


image
  1. 图像显示
    Matplotlib也支持图像的存取和显示,并且和OpenCV一类的接口比起来,对于一般的二维矩阵的可视化要方便很多,来看例子:
import matplotlib.pyplot as plt
 
# 读取一张小白狗的照片并显示
plt.figure('A Little White Dog')
little_dog_img = plt.imread('little_white_dog.jpg')
plt.imshow(little_dog_img)
 
# Z是上小节生成的随机图案,img0就是Z,img1是Z做了个简单的变换
img0 = Z
img1 = 3*Z + 4
 
# cmap指定为'gray'用来显示灰度图
fig = plt.figure('Auto Normalized Visualization')
ax0 = fig.add_subplot(121)
ax0.imshow(img0, cmap='gray')
 
ax1 = fig.add_subplot(122)
ax1.imshow(img1, cmap='gray')
 
plt.show()
1

2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容