# caffe的python接口学习（7）：绘制loss和accuracy曲线

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 19 16:22:22 2016

@author: root
"""
from numpy import *
import sys
sys.path.indert(0,'/home/xxx/caffe/python')
import matplotlib.pyplot as plt
import caffe
caffe.set_device(0)
caffe.set_mode_gpu()
# 使用SGDSolver，即随机梯度下降算法
solver = caffe.SGDSolver('./mnist/solver.prototxt')

# 等价于solver文件中的max_iter，即最大解算次数
niter = 9380
# 每隔100次收集一次数据
display= 100

# 每次测试进行100次解算，10000/100
test_iter = 100
# 每500次训练进行一次测试（100次解算），60000/64
test_interval =938

#初始化
train_loss = zeros(ceil(niter * 1.0 / display))
test_loss = zeros(ceil(niter * 1.0 / test_interval))
test_acc = zeros(ceil(niter * 1.0 / test_interval))

# iteration 0，不计入
solver.step(1)

# 辅助变量
_train_loss = 0; _test_loss = 0; _accuracy = 0
# 进行解算
for it in range(niter):
# 进行一次解算
solver.step(1)
# 每迭代一次，训练batch_size张图片
_train_loss += solver.net.blobs['loss'].data
if it % display == 0:
# 计算平均train loss
train_loss[it // display] = _train_loss / display
_train_loss = 0

if it % test_interval == 0:
for test_it in range(test_iter):
# 进行一次测试
solver.test_nets[0].forward()
# 计算test loss
_test_loss += solver.test_nets[0].blobs['loss'].data
# 计算test accuracy
_accuracy += solver.test_nets[0].blobs['accuracy'].data
# 计算平均test loss
test_loss[it / test_interval] = _test_loss / test_iter
# 计算平均test accuracy
test_acc[it / test_interval] = _accuracy / test_iter
_test_loss = 0
_accuracy = 0

# 绘制train loss、test loss和accuracy曲线
print '\nplot the train loss and test accuracy\n'
_, ax1 = plt.subplots()
ax2 = ax1.twinx()

# train loss -> 绿色
ax1.plot(display * arange(train_loss.size), train_loss, 'g')
# test loss -> 黄色
ax1.plot(test_interval * arange(test_loss.size), test_loss, 'y')
# test accuracy -> 红色
ax2.plot(test_interval * arange(test_acc.size), test_acc, 'r')

ax1.set_xlabel('iteration')
ax1.set_ylabel('loss')
ax2.set_ylabel('accuracy')
plt.show()

ubuntu中使用pycharm IDE，导入matplotlib库。竟然无法显示出图片。。。

[python] view plain

1. import matplotlib.pyplot as plt
2. input_image = root/to/your/image
3. plt.imshow(input_image)

[python] view plain

1. import matplotlib.pyplot as plt
2. import pylab
3. input_image = root/to/your/image
4. plt.imshow(input_image)
5. pylab.show()

# Matplotlib.pyplot绘图实例

{使用pyplot模块}

## matplotlib绘制直线、条形/矩形区域

import numpy as np
import matplotlib.pyplot as plt
t = np.arange(-1, 2, .01)
s = np.sin(2 * np.pi * t)

plt.plot(t,s)
# draw a thick red hline at y=0 that spans the xrange
l = plt.axhline(linewidth=4, color='r')
plt.axis([-1, 2, -1, 2])
plt.show()
plt.close()

# draw a default hline at y=1 that spans the xrange
plt.plot(t,s)
l = plt.axhline(y=1, color='b')
plt.axis([-1, 2, -1, 2])
plt.show()
plt.close()

# draw a thick blue vline at x=0 that spans the upper quadrant of the yrange
plt.plot(t,s)
l = plt.axvline(x=0, ymin=0, linewidth=4, color='b')
plt.axis([-1, 2, -1, 2])
plt.show()
plt.close()

# draw a default hline at y=.5 that spans the the middle half of the axes
plt.plot(t,s)
l = plt.axhline(y=.5, xmin=0.25, xmax=0.75)
plt.axis([-1, 2, -1, 2])
plt.show()
plt.close()

plt.plot(t,s)
p = plt.axhspan(0.25, 0.75, facecolor='0.5', alpha=0.5)
p = plt.axvspan(1.25, 1.55, facecolor='g', alpha=0.5)
plt.axis([-1, 2, -1, 2])
plt.show()

Note: 设置直线对应位置的值显示：plt.text(max_x, 0, str(round(max_x, 2)))，也就是直接在指定坐标写文字，不知道有没有其它方法？

plt.hlines(hline, xmin=plt.gca().get_xlim()[0], xmax=plt.gca().get_xlim()[1], linestyles=line_style, colors=color)

## 直方图

plt.hist(songs_plays, bins=50,range=(0, 50000), color='lightblue',normed=True)

Note: normed是将y坐标按比例绘图，而不是数目。

### hist转换成plot折线图

plt.hist直接绘制数据是hist图

plt.hist(z, bins=500, normed=True)
hist图转换成折线图
cnts, bins = np.histogram(z, bins=500, normed=True)
bins = (bins[:-1] + bins[1:]) / 2
plt.plot(bins, cnts)

[numpy教程 - 统计函数:histogram]

## 散点图、梯形图、柱状图、填充图

#### 散列图scatter()

scatter()所绘制的散列图却可以指定每个点的颜色和大小。
scatter()的前两个参数是数组，分别指定每个点的X轴和Y轴的坐标。
s参数指定点的大 小，值和点的面积成正比。它可以是一个数，指定所有点的大小；也可以是数组，分别对每个点指定大小。
c参数指定每个点的颜色，可以是数值或数组。这里使用一维数组为每个点指定了一个数值。通过颜色映射表，每个数值都会与一个颜色相对应。默认的颜色映射表中蓝色与最小值对应，红色与最大值对应。当c参数是形状为(N,3)或(N,4)的二维数组时，则直接表示每个点的RGB颜色。
marker参数设置点的形状，可以是个表示形状的字符串，也可以是表示多边形的两个元素的元组，第一个元素表示多边形的边数，第二个元素表示多边形的样式，取值范围为0、1、2、3。0表示多边形，1表示星形，2表示放射形，3表示忽略边数而显示为圆形。
alpha参数设置点的透明度。
lw参数设置线宽，lw是line width的缩写。
facecolors参数为“none”时，表示散列点没有填充色。

#### 柱状图bar()

bar()的第一个参数为每根柱子左边缘的横坐标;第二个参数为每根柱子的高度;第三个参数指定所有柱子的宽度,当第三个参数为序列时，可以为每根柱子指定宽度。bar()不自动修改颜色。

n = np.array([0,1,2,3,4,5])
x = np.linspace(-0.75, 1., 100)

fig, axes = plt.subplots(1, 4, figsize=(12,3))

axes[0].scatter(x, x + 0.25*np.random.randn(len(x)))

axes[1].step(n, n**2, lw=2)

axes[2].bar(n, n**2, align="center", width=0.5, alpha=0.5)

axes[3].fill_between(x, x**2, x**3, color="green", alpha=0.5);

Note: axes子图设置title: axes.set_title("bar plot")

## 散点图（改变颜色，大小）

import numpy as np import matplotlib.pyplot as plt

N = 50
x = np.random.rand(N)
y = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radiuses
color = 2 * np.pi * np.random.rand(N)
plt.scatter(x, y, s=area, c=color, alpha=0.5, cmap=plt.cm.hsv)
plt.show()

matplotlib绘制散点图给点加上注释

plt.scatter(data_arr[:, 0], data_arr[:, 1], c=class_labels)
for i, class_label in enumerate(class_labels):
plt.annotate(class_label, (data_arr[:, 0][i], data_arr[:, 1][i]))
[matplotlib scatter plot with different text at each data point]

## 对数坐标图

plot()所绘制图表的X-Y轴坐标都是算术坐标。

import numpy as np
import matplotlib.pyplot as plt

w = np.linspace(0.1, 1000, 1000)
p = np.abs(1/(1+0.1j*w)) # 计算低通滤波器的频率响应
plt.subplot(221)
plt.plot(w, p, linewidth=2)
plt.ylim(0,1.5)

plt.subplot(222)
plt.semilogx(w, p, linewidth=2)
plt.ylim(0,1.5)

plt.subplot(223)
plt.semilogy(w, p, linewidth=2)
plt.ylim(0,1.5)

plt.subplot(224)
plt.loglog(w, p, linewidth=2)
plt.ylim(0,1.5)

plt.show()

## 极坐标图

### 示例1

fig = plt.figure()
ax = fig.add_axes([0.0, 0.0, .6, .6], polar=True)
t = linspace(0, 2 * pi, 100)
ax.plot(t, t, color='blue', lw=3);

### 示例2

import numpy as np
import matplotlib.pyplot as plt

theta = np.arange(0, 2*np.pi, 0.02)
plt.subplot(121, polar=True)
plt.plot(theta, 1.6*np.ones_like(theta), linewidth=2) #绘制同心圆
plt.plot(3*theta, theta/3, "--", linewidth=2)

plt.subplot(122, polar=True)
plt.plot(theta, 1.4*np.cos(5*theta), "--", linewidth=2)
plt.plot(theta, 1.8*np.cos(4*theta), linewidth=2)
plt.rgrids(np.arange(0.5, 2, 0.5), angle=45)
plt.thetagrids([0, 45])

plt.show()
Note:rgrids()设置同心圆栅格的半径大小和文字标注的角度。因此右图中的虚线圆圈有三个， 半径分别为0.5、1.0和1.5,这些文字沿着45°线排列。
Thetagrids()设置放射线栅格的角度， 因此右图中只有两条放射线，角度分别为0°和45°。

## 等值线图

### 使用等值线图表示二元函数z=f(x,y)

matplotlib中可以使用contour()和contourf()描绘等值线，它们的区别是：contourf()所得到的是带填充效果的等值线。
import numpy as np
import matplotlib.pyplot as plt

y, x = np.ogrid[-2:2:200j, -3:3:300j]
z = x * np.exp( - x**2 - y**2)

extent = [np.min(x), np.max(x), np.min(y), np.max(y)]

plt.figure(figsize=(10,4))
plt.subplot(121)
cs = plt.contour(z, 10, extent=extent)
plt.clabel(cs)
plt.subplot(122)
plt.contourf(x.reshape(-1), y.reshape(-1), z, 20)
plt.show()

### 使用等值线绘制隐函数f(x,y)=0曲线

import numpy as np
import matplotlib.pyplot as plt

y, x = np.ogrid[-1.5:1.5:200j, -1.5:1.5:200j]
f = (x**2 + y**2)**4 - (x**2 - y**2)**2
plt.figure(figsize=(9,4))
plt.subplot(121)
extent = [np.min(x), np.max(x), np.min(y), np.max(y)]
cs = plt.contour(f, extent=extent, levels=[0, 0.1], colors=["b", "r"], linestyles=["solid", "dashed"], linewidths=[2, 2])
plt.subplot(122)
for c in cs.collections:
data = c.get_paths()[0].vertices
plt.plot(data[:,0], data[:,1], color=c.get_color()[0], linewidth=c.get_linewidth()[0])

plt.show()

contour() levels参数指定所绘制等值线对应的函数值，这里设置levels参数为[0，0.1],因此最终将绘制两条等值线。

cs对象的collections属性是一个等值线列表，每条等值线用一个LineCollection对象表示：
>>> cs.collections
<a list of 2 collections.LineCollection objects>

>>> c0.get_color()[0]
array([ 0., 0., 1., 1.])
>>> c0.get_linewidth()[0]
2

>>> len(cs.collections[0].get_paths())
42

>>> path = cs.collections[0].get_paths()[0]
>>> type(path)
<class 'matplotlib.path.Path'>
>>> path.vertices
array([[-0.08291457, -0.98938936],
[-0.09039269, -0.98743719],
…,
[-0.08291457, -0.98938936]])

# Matplotlib.pylab绘图实例

{使用pylab模块}

matplotlib还提供了一个名为pylab的模块，其中包括了许多NumPy和pyplot模块中常用的函数，方便用户快速进行计算和绘图，十分适合在IPython交互式环境中使用。这里使用下面的方式载入pylab模块：

>>> import pylab as pl
Note:import pyplot as plt也同样可以

Line and scatter plots(使用plot()命令), histogram(使用hist()命令)

1 折线图&散点图 Line and scatter plots

import numpy as np
import pylab as pl

x = [1, 2, 3, 4, 5]# Make an array of x values
y = [1, 4, 9, 16, 25]# Make an array of y values for each x value

pl.plot(x, y)# use pylab to plot x and y
pl.show()# show the plot on the screen

plot(x, y)        # plot x and y using default line style and color
plot(x, y, 'bo')  # plot x and y using blue circle markers
plot(y)           # plot y using x as index array 0..N-1
plot(y, 'r+')     # ditto, but with red plusses

plt.plot(ks, wssses, marker='*', markerfacecolor='r', linestyle='-', color='b')

散点图 Scatter plots

marker样式 Changing the marker style

import numpy as np
import pylab as pl

x = [1, 2, 3, 4, 5]# Make an array of x values
y = [1, 4, 9, 16, 25]# Make an array of y values for each x value
pl.plot(x, y)# use pylab to plot x and y

pl.title(’Plot of y vs. x’)# give plot a title
pl.xlabel(’x axis’)# make axis labels
pl.ylabel(’y axis’)

pl.xlim(0.0, 7.0)# set axis limits
pl.ylim(0.0, 30.)

pl.show()# show the plot on the screen

一个坐标系上绘制多个图 Plotting more than one plot on the same set of axes

import numpy as np
import pylab as pl
x1 = [1, 2, 3, 4, 5]# Make x, y arrays for each graph
y1 = [1, 4, 9, 16, 25]
x2 = [1, 2, 4, 6, 8]
y2 = [2, 4, 8, 12, 16]

pl.plot(x1, y1, ’r’)# use pylab to plot x and y
pl.plot(x2, y2, ’g’)

pl.title(’Plot of y vs. x’)# give plot a title
pl.xlabel(’x axis’)# make axis labels
pl.ylabel(’y axis’)

pl.xlim(0.0, 9.0)# set axis limits
pl.ylim(0.0, 30.)

pl.show()# show the plot on the screen

pl.legend((plot1, plot2), (’label1, label2’),loc='best’, numpoints=1)

import numpy as np
import pylab as pl

x1 = [1, 2, 3, 4, 5]# Make x, y arrays for each graph
y1 = [1, 4, 9, 16, 25]
x2 = [1, 2, 4, 6, 8]
y2 = [2, 4, 8, 12, 16]

plot1 = pl.plot(x1, y1, ’r’)# use pylab to plot x and y : Give your plots names
plot2 = pl.plot(x2, y2, ’go’)

pl.title(’Plot of y vs. x’)# give plot a title
pl.xlabel(’x axis’)# make axis labels
pl.ylabel(’y axis’)

pl.xlim(0.0, 9.0)# set axis limits
pl.ylim(0.0, 30.)

pl.legend([plot1, plot2], (’red line’, ’green circles’), ’best’, numpoints=1)# make legend
pl.show()# show the plot on the screen

2 直方图 Histograms

import numpy as np
import pylab as pl

# make an array of random numbers with a gaussian distribution with
# mean = 5.0
# rms = 3.0
# number of points = 1000
data = np.random.normal(5.0, 3.0, 1000)

# make a histogram of the data array
pl.hist(data)

# make plot labels
pl.xlabel(’data’)
pl.show()

bins = np.arange(-5., 16., 1.) #浮点数版本的range
pl.hist(data, bins, histtype=’stepfilled’)

fig1 = pl.figure(1)
pl.subplot(211)
subplot(211)把绘图区域等分为2行*1列共两个区域, 然后在区域1(上区域)中创建一个轴对象. pl.subplot(212)在区域2(下区域)创建一个轴对象。

You can play around with plotting a variety of layouts. For example, Fig. 11 is created using the following commands:

f1 = pl.figure(1)
pl.subplot(221)
pl.subplot(222)
pl.subplot(212)

# 绘制圆形Circle和椭圆Ellipse

1. 调用包函数

[python] view plain
?
1. ###################################
2. #   coding=utf-8
3. #   !/usr/bin/env python
4. #   __author__ = 'pipi'
5. #   ctime 2014.10.11
6. #   绘制椭圆和圆形
7. ###################################
8. from matplotlib.patches import Ellipse, Circle
9. import matplotlib.pyplot as plt
10.
11. fig = plt.figure()
13.
14. ell1 = Ellipse(xy = (0.00.0), width = 4, height = 8, angle = 30.0, facecolor= 'yellow', alpha=0.3)
15. cir1 = Circle(xy = (0.00.0), radius=2, alpha=0.5)
18.
19. x, y = 00
20. ax.plot(x, y, 'ro')
21.
22. plt.axis('scaled')
23. # ax.set_xlim(-4, 4)
24. # ax.set_ylim(-4, 4)
25. plt.axis('equal')   #changes limits of x or y axis so that equal increments of x and y have the same length
26.
27. plt.show()

p187

18.7 Ellipses (see arc)

p631class matplotlib.patches.Ellipse(xy, width, height, angle=0.0, **kwargs)Bases: matplotlib.patches.PatchA scale-free ellipse.xy center of ellipsewidth total length (diameter) of horizontal axisheight total length (diameter) of vertical axisangle rotation in degrees (anti-clockwise)p626class matplotlib.patches.Circle(xy, radius=5, **kwargs)

[python] view plain
?
1. #coding=utf-8
2. import numpy as np
3. import matplotlib.pyplot as plt
4.
5. x = y = np.arange(-440.1)
6. x, y = np.meshgrid(x,y)
7. plt.contour(x, y, x**2 + y**2, [9])     #x**2 + y**2 = 9 的圆形
8.
9. plt.axis('scaled')
10. plt.show()
p478
Axes3D.contour(X, Y, Z, *args, **kwargs)
Create a 3D contour plot.
Argument Description
X, Y, Data values as numpy.arrays

extend3d
stride
zdir
offset
Whether to extend contour in 3D (default: False)
Stride (step size) for extending contour
The direction to use: x, y or z (default)
If specified plot a projection of the contour lines on this position in plane normal to zdir
The positional and other

p1025

matplotlib.pyplot.axis(*v, **kwargs)Convenience method to get or set axis properties.

2. 直接绘制

[python] view plain
?
1. #coding=utf-8
2. '''''
3. Created on Jul 14, 2014
4. @author: pipi
5. '''
6. from math import pi
7. from numpy import cos, sin
8. from matplotlib import pyplot as plt
9.
10. if __name__ == '__main__':
11.     '''''plot data margin'''
12.     angles_circle = [i*pi/180 for i in range(0,360)]                 #i先转换成double
13.     #angles_circle = [i/np.pi for i in np.arange(0,360)]             # <=>
14.     # angles_circle = [i/180*pi for i in np.arange(0,360)]    X
15.     x = cos(angles_circle)
16.     y = sin(angles_circle)
17.     plt.plot(x, y, 'r')
18.
19.     plt.axis('equal')
20.     plt.axis('scaled')
21.     plt.show()

# 绘图小技巧

### 控制坐标轴的显示——使x轴显示名称字符串而不是数字的两种方法

plt.xticks(range(len(list)), x, rotation='vertical')

Note:x代表一个字符串列表，如x轴上要显示的名称。

axes.set_xticklabels(x, rotation='horizontal', lod=True)

Note:这里axes是plot的一个subplot()

### 获取x轴上坐标最小最大值

xmin， xmax = plt.gca().get_xlim()

### 在指定坐标写文字

plt.text(max_x, 0, str(round(max_x, 2)))

# 附录 - matplotlib中的作图参数

a set of tables that show main properties and styles

plot(x, y, color='green', linestyle='dashed', marker='o', markerfacecolor='blue', markersize=12).

• 蓝色： 'b' (blue)
• 绿色： 'g' (green)
• 红色： 'r' (red)
• 蓝绿色(墨绿色)： 'c' (cyan)
• 红紫色(洋红)： 'm' (magenta)
• 黄色： 'y' (yellow)
• 黑色： 'k' (black)
• 白色： 'w' (white)
• 灰度表示： e.g. 0.75 ([0,1]内任意浮点数)
• RGB表示法： e.g. '#2F4F4F' 或 (0.18, 0.31, 0.31)
• 任意合法的html中的颜色表示： e.g. 'red', 'darkslategray'

## 线属性Line properties

Property Description Appearance
alpha (or a) alpha transparency on 0-1 scale
antialiased True or False - use antialised rendering
color (or c) matplotlib color arg
linestyle (or ls) see Line properties
linewidth (or lw) float, the line width in points
solid_capstyle Cap style for solid lines
solid_joinstyle Join style for solid lines
dash_capstyle Cap style for dashes
dash_joinstyle Join style for dashes
marker see Markers
markeredgewidth (mew) line width around the marker symbol
markeredgecolor (mec) edge color if a marker is used
markerfacecolor (mfc) face color if a marker is used
markersize (ms) size of the marker in points

## 线型Line styles（简写为 ls）：

• 实线： '-'
• 虚线： '--'
• 虚点线： '-.'
• 点线： ':'
• 点： '.'
Symbol Description Appearance
- solid line
-- dashed line
-. dash-dot line
: dotted line
. points
, pixels
o circle
^ triangle up
v triangle down
< triangle left
> triangle right
s square
+ plus
x cross
D diamond
d thin diamond
1 tripod down
2 tripod up
3 tripod left
4 tripod right
h hexagon
H rotated hexagon
p pentagon
| vertical line
_ horizontal line

• 像素： ','
• 圆形： 'o'
• 上三角： '^'
• 下三角： 'v'
• 左三角： '<'
• 右三角： '>'
• 方形： 's'
• 加号： '+'
• 叉形： 'x'
• 棱形： 'D'
• 细棱形： 'd'
• 三脚架朝下： '1'（就是丫）
• 三脚架朝上： '2'
• 三脚架朝左： '3'
• 三脚架朝右： '4'
• 六角形： 'h'
• 旋转六角形： 'H'
• 五角形： 'p'
• 垂直线： '|'
• 水平线： '_'
• gnuplot 中的steps： 'steps' （只能用于kwarg中）
Symbol Description Appearance
0 tick left
1 tick right
2 tick up
3 tick down
4 caret left
5 caret right
6 caret up
7 caret down
o circle
D diamond
h hexagon 1
H hexagon 2
_ horizontal line
1 tripod down
2 tripod up
3 tripod left
4 tripod right
8 octagon
p pentagon
^ triangle up
v triangle down
< triangle left
> triangle right
d thin diamond
, pixel
+ plus
. point
s square
* star
| vertical line
x cross
r'$\sqrt{2}$' any latex expression

• markersize： 实数

• markeredgewidth：实数

• markeredgecolor：颜色选项中的任意值

• markerfacecolor：颜色选项中的任意值

• alpha： [0,1]之间的浮点数

• linewidth： 实数
[Quick references]

matplotlib绘图手册  /subplot

matplotlib绘图库入门

barChart:http://www.cnblogs.com/qianlifeng/archive/2012/02/13/2350086.html

Gnuplot的介绍

IBM:基于 Python Matplotlib 模块的高质量图形输出(2005年的文章有点旧)

matplotlib技巧集(绘制不连续函数的不连续点；参数曲线上绘制方向箭头；修改缺省刻度数目；Y轴不同区间使用不同颜色填充的曲线区域。)