matplotlib 画图

1. 画曲线图

  1.  
     
  2.  
    Tompson = np.array([0, 0, 0, 0, 0.011, 0.051, 0.15, 0.251, 0.35, 0.44, 0.51, 0.59, 0.65, 0.68, 0.725, 0.752, 0.8])
  3.  
    ours = np.array([0.00000000e+00, 1.21182744e-04, 4.26563257e-02,
  4.  
    1.76078526e-01, 3.51187591e-01, 5.02666020e-01,
  5.  
    6.18274358e-01, 7.03102278e-01, 7.61754726e-01,
  6.  
    8.12893844e-01, 8.63427048e-01, 9.02205526e-01,
  7.  
    9.30198740e-01, 9.51284537e-01, 9.61706253e-01,
  8.  
    9.74066893e-01, 9.79641299e-01])
  9.  
    Deep_prior = np.array([0, 0, 0.03, 0.09, 0.15, 0.251, 0.34, 0.415, 0.49, 0.55, 0.62, 0.69, 0.74, 0.79, 0.83, 0.86, 0.9])
  10.  
    Zhou = np.array([0, 0, 0.023, 0.1, 0.21, 0.325, 0.415, 0.52, 0.59, 0.661, 0.73, 0.78, 0.85, 0.885, 0.91, 0.94, 0.95])
  11.  
    Feedback_loop = np.array(
  12.  
        [0, 0, 0.022, 0.09, 0.20, 0.32, 0.415, 0.53, 0.642, 0.72, 0.79, 0.85, 0.88, 0.91, 0.951, 0.96, 0.965])
  13.  
    Crossing_net = np.array(
  14.  
        [0, 0, 0.07, 0.17, 0.25, 0.36, 0.485, 0.62, 0.715, 0.79, 0.865, 0.906, 0.92, 0.95, 0.952, 0.970, 0.97])
  15.  
    qinghua = np.array([ 0.        ,  0.00121183,  0.06386331,  0.17886573,  0.3427048 ,
  16.  
            0.4655841 ,  0.57828405,  0.67716917,  0.76223946,  0.82222492,
  17.  
            0.87433349,  0.91250606,  0.94122637,  0.96122152,  0.9726127 ,
  18.  
            0.9831556 ,  0.98679108])
  19.  
    def draw_map(errs1, errs2, errs3, errs4, errs5, errs6, errs7):
  20.  
        # err_flat = errs.ravel()  # Return a flattened array, 相同功能的函数为np.flat
  21.  
        thresholds = np.arange(0, 85, 5)  # 不包含85
  22.  
        fig=plt.figure(figsize=(10, 8)) # 设置figsize的大小
  23.  
        ax = fig.add_subplot(111)
  24.  
        ax.plot(thresholds, errs1, '-.', thresholds, errs2, '-_',
  25.  
                 thresholds, errs3, '--', thresholds, errs4, '--*', thresholds, errs5, ':*',
  26.  
                 thresholds, errs6, ':x', linewidth=2)
  27.  
        ax.plot(thresholds, errs7, '-', linewidth=2.25, color='b')
  28.  
        ax.set_xlabel('Maximum joint error threshold (mm)', fontsize=15)
  29.  
        ax.set_ylabel('Fraction of frames within threshold', fontsize=15)
  30.  
        ax.tick_params(axis='x', labelsize=15)
  31.  
        ax.tick_params(axis='y', labelsize=15)    
  32.  
    #     设置x, y轴的数字字号    
  33.  
    #     plt.rcParams['xtick.labelsize']=15
  34.  
    #     plt.rcParams['ytick.labelsize']=15
  35.  
    #     或者   
  36.  
    #     plt.set_xticks(fontsize=15)  # 设置坐标轴刻度字体大小
  37.  
    #     plt.set_yticks(fontsize=15)
  38.  
        ax.legend(['Tompson et al.', 'Prior', 'Zhou et al.', 'Feedback',  'REN', 'Crossing Nets','ours'], loc='lower right',
  39.  
                   prop={'size': 15})
  40.  
        ax.grid(True)
  41.  
     
  42.  
    fig=draw_map(Tompson, Deep_prior, Zhou, Feedback_loop, qinghua, Crossing_net, ours)
  43.  
     
  44.  
     
  1. <span style="font-size:18px">
  2. plt.savefig('D:\\filename.svg',format='svg')  #保持为eps格式或者svg格式
  3. plt.show()</span>

前面依然使用plt句柄,只是最后获取当前图像

  1.  
    # plt调用gcf函数取得当前绘制的figure并调用savefig函数
  2.  
    foo_fig = plt.gcf() # 'get current figure'
  3.  
    foo_fig.savefig('foo.eps', format='eps', dpi=1000)
  4.  
    plt.show()

2. 画柱状图

  1.  
    def draw_error(errs1, errs2, errs3, errs4, errs5, errs6, dataset='nyu'):
  2.  
    bar_width = 0.23
  3.  
    opacity = 0.4
  4.  
    # 将总体的mean计算出来也放进去!!
  5.  
    if dataset == 'icvl':
  6.  
    joint_idx = [0, 1, 3, 4, 6, 7, 9, 10, 12, 13, 15, 16]
  7.  
    names = ['Palm', 'Thumb.R', 'Thumb.T', 'Index.R', 'Index.T', 'Mid.R', 'Mid.T', 'Ring.R', 'Ring.T', 'Pinky.R',
  8.  
    'Pinky.T', 'Mean']
  9.  
    elif dataset == 'nyu':
  10.  
    joint_idx = [0, 1, 2, 3, 4, 5, 6, 7, 13, 11, 12, 8, 9, 10, 14]
  11.  
    names = ['P1', 'P2', 'R1', 'R2', 'M1', 'M2', 'I1', 'I2', 'C', 'W1', 'W2', 'T1', 'T2', 'T3', 'AVG']
  12.  
     
  13.  
    x = np.arange(len(joint_idx))
  14.  
    plt.figure(figsize=(12, 8))
  15.  
    # plt.bar(x, errs1[joint_idx]) # 选中indx为joint_idx的元素
  16.  
    # plt.title('error')
  17.  
    plt.xticks(x + 0.5, names, fontsize=15) # set the locations and labels of the xticks , rotation='vertical'
  18.  
    plt.yticks(fontsize=15) # 设置坐标轴刻度字体大小
  19.  
    plt.ylabel('Mean Error (mm)', fontsize=15)
  20.  
    # plt.grid(True)
  21.  
     
  22.  
    rects1 = plt.bar(x, errs1, bar_width / 2, alpha=opacity, color='y', label='Tompson et al.')
  23.  
    rects2 = plt.bar(x + bar_width / 2, errs2, bar_width / 2, alpha=opacity, color='k', label='Prior')
  24.  
     
  25.  
    rects3 = plt.bar(x + bar_width, errs3, bar_width / 2, alpha=opacity, color='c', label='Zhou et al.')
  26.  
    rects4 = plt.bar(x + 1.5 * bar_width, errs4, bar_width / 2, alpha=opacity, color='m', label='Feedback')
  27.  
    rects5 = plt.bar(x + 2 * bar_width, errs5[joint_idx], bar_width / 2, alpha=opacity, color='g', label='REN')
  28.  
    rects6 = plt.bar(x + 2.5 * bar_width, errs6[joint_idx], bar_width / 2, alpha=opacity, color='b', label='ours')
  29.  
     
  30.  
    plt.legend(loc='upper left', prop={'size': 12})
  31.  
    plt.tight_layout()
  32.  
    foo_fig = plt.gcf() # 'get current figure'
  33.  
    foo_fig.savefig('柱状图.eps', format='eps', dpi=1000)
  34.  
    plt.show()

3. 转载的一个教程: 点击打开链接

官网介绍:

matplotlib API

一个很详细的博客:

matplotlib绘图基础

漂亮插图demo

基础知识:

首先一幅Matplotlib的图像组成部分介绍。

在matplotlib中,整个图像为一个Figure对象。在Figure对象中可以包含一个或者多个Axes对象。每个Axes(ax)对象都是一个拥有自己坐标系统的绘图区域。所属关系如下:

下面以一个直线图来详解图像内部各个组件内容:

其中:title为图像标题,Axis为坐标轴, Label为坐标轴标注,Tick为刻度线,Tick Label为刻度注释。各个对象关系可以梳理成以下内容:

图像中所有对象均来自于Artist的基类。

上面基本介绍清楚了图像中各个部分的基本关系,下面着重讲一下几个部分的详细的设置。

一个"Figure"意味着用户交互的整个窗口。在这个figure中容纳着"subplots"。

当我们调用plot时,matplotlib会调用gca()获取当前的axes绘图区域,而且gca反过来调用gcf()来获得当前的figure。如果figure为空,它会自动调用figure()生成一个figure, 严格的讲,是生成subplots(111)

Figures

Subplots

  1.  
    plt.subplot(221) # 第一行的左图
  2.  
    plt.subplot(222) # 第一行的右图
  3.  
    plt.subplot(212) # 第二整行
  4.  
    plt.show()

注意:其中各个参数也可以用逗号,分隔开。第一个参数代表子图的行数;第二个参数代表该行图像的列数; 第三个参数代表每行的第几个图像。

另外:fig, ax = plt.subplots(2,2),其中参数分别代表子图的行数和列数,一共有 2x2 个图像。函数返回一个figure图像和一个子图ax的array列表。

补充:gridspec命令可以对子图区域划分提供更灵活的配置。

中文显示方框问题

这是由于matplotlib文件夹内没有中文字体包导致的,实际上函数包本身是支持中文的,常见解决方案是拷贝字体文件到matplotlib中,不过我感觉太麻烦,找到了另外的方式,

1
2
3
4
from pylab import mpl
 
mpl.rcParams['font.sans-serif'= ['FangSong']    # 指定默认字体
mpl.rcParams['axes.unicode_minus'= False        # 解决保存图像是负号'-'显示为方块的问题  

加上这三行代码指定一下字体就行了(实际上最后一行可以不加)

常用绘制流程

1.axes列表中包含各个子图句柄

1
2
3
4
5
6
7
# 3x3子图
fig, axes = plt.subplots(33)
# 子图间距设定
fig.subplots_adjust(hspace=0.3, wspace=0.3)
# 在分别绘制各个子图
for i, ax in enumerate(axes.flat):
    pass

2.每个子图句柄需要单独生成

1
2
3
4
5
6
7
8
# 画布
fig = plt.figure()
# 添加子图
ax = fig.add_subplot(211)
pass
# 添加子图
ax2 = fig.add_subplot(212)
pass

3.使用plt包命名空间代指多个子图句柄

【注】这种方法的句柄含在plt中,与上面的ax的方法属性并不相同,下面会详解

1
2
3
4
5
6
7
8
9
# 添加子图
plt.subplot(311)
pass
# 添加子图
plt.subplot(312)
pass
# 添加子图
plt.subplot(313)
pass

绘图功能

【注】使用ax代指子图方法1、2的句柄,plt代指方法3中的命名空间。坐标生成:

1
2
3
4
5
6
# 一维坐标生成
= np.linspace(0,10,100)
 
# 二维网格生成
= np.linspace(-1,1,100)
x,y = np.meshgrid(u,u)

坐标轴标签:

1
2
3
4
5
6
7
8
xlabel = "True: {0}, Pred: {1}".format(cls_true[i], cls_pred[i])
xlabel = "y"
 
ax.set_xlabel(xlabel)
ax.set_ylabel(ylabel)
 
plt.xlabel('x')
plt.ylabel('y')

坐标轴刻度:

1
2
3
4
5
ax.set_xticks([])
ax.set_yticks([])
 
plt.xticks(range(len(x)), ['a''b''c''d''e''f'])
plt.yticks(range(182))

坐标网格:

1
2
3
4
5
6
7
# 横纵坐标单位长度统一
plt.axis('equal')
# 网格
plt.grid(True)
 
# 网格
ax.grid(True)

图表标题:

1
plt.title('Second Derivative')

对数坐标:

1
2
3
4
5
'''对数坐标'''
 
plt.semilogx(x,y)  # 对x取对数
plt.semilogy(x,y)  # 对y取对数
plt.loglog(x,y)    # 同时取对数

绘图:

1
2
3
4
5
6
7
8
9
10
# 色彩填充
ax.fill(x,y1,facecolor='g',alpha=0.3)
ax.fill_between(x,y,y1,facecolor='b')
# 等高线
ax.contourf(x,y,z)
# 显示数组,因为是数组所以才会有vmin和vmax的关键字
ax.imshow()
 
# 线性绘图
plt.plot(x,y1,c='b',linestyle='',marker='^')

经典实现

饼状图

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
 
plt.figure(figsize=(12,9))
 
labels = ['part1''part2''part3']
# 各个饼的比例
sizes = [302050]
colors = ['yellowgreen''gold''lightskyblue']
 
# 各个模块离圆心的距离,参数为距离
explode = (0.050.00.0
# 图 label的text 比例的text
patches, l_texts, p_texts = plt.pie(sizes, explode=explode, labels=labels, colors=colors, labeldistance=0.8,
        autopct='%3.1f%%', shadow=True, startangle=90, pctdistance=0.6)
 
# 设置x,y轴刻度一致,这样饼图才能是圆的
plt.axis('equal')
plt.legend()
 
# 设置label的字体大小
for in l_texts:
    t.set_size(20)
# 设置比例数字的字体大小
for in p_texts:
    t.set_size(20)
 
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
import numpy as np
from matplotlib import pyplot as plt
 
plt.figure(figsize=(9,6))
 
= 12
= np.arange(n)+1
# numpy.random.uniform(low=0.0, high=1.0, size=None), normal
Y1 = (1-X/float(n+1)) * np.random.uniform(0.5,1.0,n)
Y2 = (1-X/float(n+1)) * np.random.uniform(0.5,1.0,n)
 
# bar and barh
width = 0.35
plt.bar(X, Y1, width=width, facecolor='#9999ff', edgecolor='white')
plt.bar(X+width, Y2, width=width, facecolor='#ff9999', edgecolor='white')
plt.bar(X, -Y2, width=width, facecolor='#ff9999', edgecolor='white')
 
# 柱状图添加说明文字
for x,y in zip(X,Y1):
    plt.text(x, y+0.05'%.2f' % y, ha='center', va= 'bottom')
     
for x,y in zip(X,-Y2):
    plt.text(x+0.4, y-0.15'%.2f' % y, ha='center', va= 'bottom')
 
#plt.ylim(-1.25,+1.25)
plt.show()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np
from matplotlib import pyplot as plt
 
plt.figure(figsize=(9,6))
 
= 12
= np.arange(n)+1
# numpy.random.uniform(low=0.0, high=1.0, size=None), normal
Y1 = (1-X/float(n+1)) * np.random.uniform(0.5,1.0,n)
Y2 = (1-X/float(n+1)) * np.random.uniform(0.5,1.0,n)
 
# bar and barh
width = 0.35
# 方法barh和参数height可以实现横向的柱状图
plt.barh(X, Y1, height=width, facecolor='#9999ff', edgecolor='white')
 
plt.show()

概率分布图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from matplotlib import pyplot as plt
import numpy as np
 
mu = 0
sigma = 1
= mu + sigma*np.random.randn(10000)
 
fig,(ax0,ax1)=plt.subplots(ncols=2, figsize=(9,6))
 
ax0.hist(x, 20, normed=1, histtype='bar', facecolor='g', rwidth=0.8, alpha=0.75)
ax0.set_title('pdf')
# 累积概率密度分布
ax1.hist(x, 20, normed=1, histtype='bar', rwidth=0.8, cumulative=True)
ax1.set_title('cdf')
 
plt.show()

散点图

atan2(a,b)是4象限反正切,它的取值不仅取决于正切值a/b,还取决于点 (b, a) 落入哪个象限: 当点(b, a) 落入第一象限时,atan2(a,b)的范围是 0 ~ pi/2;  当点(b, a) 落入第二象限时,atan2(a,b)的范围是 pi/2 ~ pi; 当点(b, a) 落入第三象限时,atan2(a,b)的范围是 -pi~-pi/2;  当点(b, a) 落入第四象限时,atan2(a,b)的范围是 -pi/2~0

而 atan(a/b) 仅仅根据正切值为a/b求出对应的角度 (可以看作仅仅是2象限反正切): 当 a/b > 0 时,atan(a/b)取值范围是 0 ~ pi/2; 当 a/b < 0 时,atan(a/b)取值范围是 -pi/2~0

故 atan2(a,b) = atan(a/b) 仅仅发生在 点 (b, a) 落入第一象限 (b>0, a>0)或 第四象限(b>0, a0 , 故 atan(a/b) 取值范围是 0 ~ pi/2,2atan(a/b) 的取值范围是 0 ~ pi,而此时atan2(a,b)的范围是 -pi~-pi/2,很显然,atan2(a,b) = 2atan(a/b)

举个最简单的例子,a = 1, b = -1,则 atan(a/b) = atan(-1) = -pi/4, 而 atan2(a,b) = 3*pi/4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from matplotlib import pyplot as plt
import numpy as np
 
plt.figure(figsize=(9,6))
 
= 1024
 
# 均匀分布 高斯分布
# rand 和 randn
= np.random.rand(1,n)
= np.random.rand(1,n)
 
# 设定颜色
= np.arctan2(Y,X)
 
plt.scatter(X,Y, s=75, c=T, alpha=.4, marker='o')
 
#plt.xlim(-1.5,1.5), plt.xticks([])
#plt.ylim(-1.5,1.5), plt.yticks([])
 
plt.show()

不规则组合图

# 定义子图区域
left, width = 0.1, 0.65
bottom, height = 0.1, 0.65
bottom_h = left_h = left + width + 0.02

rect_scatter = [left, bottom, width, height]
rect_histx = [left, bottom_h, width, 0.2]
rect_histy = [left_h, bottom, 0.2, height]

plt.figure(1, figsize=(6, 6))

# 需要传入[左边起始位置,下边起始位置,宽,高]
# 根据子图区域来生成子图
axScatter = plt.axes(rect_scatter)
axHistx = plt.axes(rect_histx)
axHisty = plt.axes(rect_histy)

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# ref : http://matplotlib.org/examples/pylab_examples/scatter_hist.html
 
import numpy as np
import matplotlib.pyplot as plt
 
# the random data
= np.random.randn(1000)
= np.random.randn(1000)
 
# 定义子图区域
left, width = 0.10.65
bottom, height = 0.10.65
bottom_h = left_h = left + width + 0.02
 
rect_scatter = [left, bottom, width, height]
rect_histx = [left, bottom_h, width, 0.2]
rect_histy = [left_h, bottom, 0.2, height]
 
plt.figure(1, figsize=(66))
 
# 根据子图区域来生成子图
axScatter = plt.axes(rect_scatter)
axHistx = plt.axes(rect_histx)
axHisty = plt.axes(rect_histy)
 
# no labels
#axHistx.xaxis.set_ticks([])
#axHisty.yaxis.set_ticks([])
 
# now determine nice limits by hand:
N_bins=20
xymax = np.max([np.max(np.fabs(x)), np.max(np.fabs(y))])
binwidth = xymax/N_bins
lim = (int(xymax/binwidth) + 1* binwidth
nlim = -lim
 
# 画散点图,概率分布图
axScatter.scatter(x, y)
axScatter.set_xlim((nlim, lim))
axScatter.set_ylim((nlim, lim))
 
bins = np.arange(nlim, lim + binwidth, binwidth)
axHistx.hist(x, bins=bins)
axHisty.hist(y, bins=bins, orientation='horizontal')
 
# 共享刻度
axHistx.set_xlim(axScatter.get_xlim())
axHisty.set_ylim(axScatter.get_ylim())
 
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
28
29
import numpy as np
import matplotlib.pyplot as plt
 
fig = plt.figure(figsize=(9,6),facecolor='white')
 
# Number of ring
= 50
size_min = 50
size_max = 50*50
 
# Ring position
= np.random.rand(n,2)
 
# Ring colors R,G,B,A
= np.ones((n,4)) * (0.5,0.5,0,1)
# Alpha color channel goes from 0 (transparent) to 1 (opaque),很厉害的实现
C[:,3= np.linspace(0,1,n)
 
# Ring sizes
= np.linspace(size_min, size_max, n)
 
# Scatter plot
plt.scatter(P[:,0], P[:,1], s=S, lw = 0.5,
                  edgecolors = C, facecolors=C)
 
plt.xlim(0,1), plt.xticks([])
plt.ylim(0,1), plt.yticks([])
 
plt.show()

美化

1
2
3
4
5
6
7
8
# 美化matplotlib绘出的图,导入后自动美化
import seaborn as sns
 
# matplotlib自带美化风格
# 打印可选风格
print(plt.style.available #ggplot, bmh, dark_background, fivethirtyeight, grayscale)
# 激活风格
plt.style.use('bmh')

一维颜色填充 & 三维绘图 & 三维等高线图

『Python』Numpy学习指南第九章_使用Matplotlib绘图

from mpl_toolkits.mplot3d import Axes3D

ax = fig.add_subplot(111,projection='3d')

ax.plot() 绘制3维线

ax.plot_surface绘制三维网格(面)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from mpl_toolkits.mplot3d import Axes3D   #<-----导入3D包
import numpy as np
import matplotlib.pyplot as plt
 
fig = plt.figure(figsize=(9,6))
ax = fig.add_subplot(111,projection='3d'#<-----设置3D模式子图
<br># 新思路,之前都是生成x和y绘制z=f(x,y)的函数,这次绘制x=f1(z),y=f2(z)
= np.linspace(061000)
= 1
= * np.sin(np.pi*2*z)
= * np.cos(np.pi*2*z)
 
ax.plot(x, y, z, label=u'螺旋线', c='r')
ax.legend()
 
# dpi每英寸长度的点数
plt.savefig('3d_fig.png',dpi=200)
plt.show()

# ax.plot 绘制的是3维线,ax.plot_surface绘制的是三维网格(也就是面)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import cm
 
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
print(X,Y,Z)
# ax.plot 绘制的是3维线,ax.plot_surface绘制的是三维网格(也就是面)
ax.plot_surface(X, Y, Z, rstride=5, cstride=5, alpha=0.3)
# 三维图投影制作,zdir选择投影方向坐标轴
cset = ax.contour(X, Y, Z, 10, zdir='z', offset=-100, cmap=cm.coolwarm)
cset = ax.contour(X, Y, Z, zdir='x', offset=-40, cmap=cm.coolwarm)
cset = ax.contour(X, Y, Z, zdir='y', offset=40, cmap=cm.coolwarm)
 
ax.set_xlabel('X')
ax.set_xlim(-4040)
ax.set_ylabel('Y')
ax.set_ylim(-4040)
ax.set_zlabel('Z')
ax.set_zlim(-100100)
 
plt.show()

# 为等高线图添加标注

1
2
cs = ax2.contour(X,Y,Z)
ax2.clabel(cs, inline=1, fontsize=5)

配置Colorbar

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# -*- coding: utf-8 -*- 
#********************************************************** 
import os 
import numpy as np 
import wlab #pip install wlab 
import matplotlib 
import matplotlib.cm as cm 
import matplotlib.pyplot as plt 
from matplotlib.ticker import MultipleLocator 
from scipy.interpolate import griddata 
matplotlib.rcParams['xtick.direction'= 'out' 
matplotlib.rcParams['ytick.direction'= 'out' 
#********************************************************** 
FreqPLUS=['F06925','F10650','F23800','F18700','F36500','F89000'
FindPath='/d3/MWRT/R20130805/' 
#********************************************************** 
fig = plt.figure(figsize=(8,6), dpi=72, facecolor="white"
axes = plt.subplot(111
axes.cla()#清空坐标轴内的所有内容 
#指定图形的字体 
font = {'family' 'serif'
        'color'  'darkred'
        'weight' 'normal'
        'size'   16
        
#********************************************************** 
# 查找目录总文件名中保护F06925,EMS和txt字符的文件 
for fp in FreqPLUS: 
    FlagStr=[fp,'EMS','txt'
    FileList=wlab.GetFileList(FindPath,FlagStr) 
    
    LST=[]#地表温度 
    EMS=[]#地表发射率 
    TBH=[]#水平极化亮温 
    TBV=[]#垂直极化亮温 
    
    findex=0 
    for fn in FileList: 
        findex=findex+1 
        if (os.path.isfile(fn)): 
            print(str(findex)+'-->'+fn) 
            #fn='/d3/MWRT/R20130805/F06925_EMS60.txt' 
            data=wlab.dlmread(fn) 
            EMS=EMS+list(data[:,1])#地表发射率 
            LST=LST+list(data[:,2])#温度 
            TBH=TBH+list(data[:,8])#水平亮温 
            TBV=TBV+list(data[:,9])#垂直亮温 
    #----------------------------------------------------------- 
    #生成格点数据,利用griddata插值 
    grid_x, grid_y = np.mgrid[275:315:10.60:0.95:0.01
    grid_z = griddata((LST,EMS), TBH, (grid_x, grid_y), method='cubic'
    #将横纵坐标都映射到(0,1)的范围内 
    extent=(0,1,0,1
     #指定colormap 
    cmap = matplotlib.cm.jet 
    #设定每个图的colormap和colorbar所表示范围是一样的,即归一化 
    norm = matplotlib.colors.Normalize(vmin=160, vmax=300
    #显示图形,此处没有使用contourf #>>>ctf=plt.contourf(grid_x,grid_y,grid_z) 
    gci=plt.imshow(grid_z.T, extent=extent, origin='lower',cmap=cmap, norm=norm) 
    #配置一下坐标刻度等 
    ax=plt.gca() 
    ax.set_xticks(np.linspace(0,1,9)) 
    ax.set_xticklabels( ('275''280''285''290''295',  '300',  '305',  '310''315')) 
    ax.set_yticks(np.linspace(0,1,8)) 
    ax.set_yticklabels( ('0.60''0.65''0.70''0.75''0.80','0.85','0.90','0.95')) 
    #显示colorbar 
    cbar = plt.colorbar(gci) 
    cbar.set_label('$T_B(K)$',fontdict=font) 
    cbar.set_ticks(np.linspace(160,300,8)) 
    cbar.set_ticklabels( ('160''180''200''220''240',  '260',  '280',  '300')) 
    #设置label 
    ax.set_ylabel('Land Surface Emissivity',fontdict=font) 
    ax.set_xlabel('Land Surface Temperature(K)',fontdict=font) #陆地地表温度LST 
    #设置title 
    titleStr='$T_B$ for Freq = '+str(float(fp[1:-1])*0.01)+'GHz' 
    plt.title(titleStr) 
    figname=fp+'.png' 
    plt.savefig(figname) 
    plt.clf()#清除图形 
   
#plt.show() 
print('ALL -> Finished OK')

上面的例子中,每个保存的图,都是用同样的colormap,并且每个图的颜色映射值都是一样的,也就是说第一个图中如果200表示蓝色,那么其他图中的200也表示蓝色。

示例的图形如下:

4.  样式美化(matplotlib.pyplot.style.use)  点击打开链接

使用matplotlib自带的几种美化样式,就可以很轻松的对生成的图形进行美化。

可以使用matplotlib.pyplot.style.available获取所有的美化样式

  1. #!/usr/bin/python
  2. #coding: utf-8
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. # 获取所有的自带样式
  6. print plt.style.available
  7. # 使用自带的样式进行美化
  8. plt.style.use("ggplot")
  9. fig, axes = plt.subplots(ncols = 2, nrows = 2)
  10. # 四个子图的坐标轴赋予四个对象
  11. ax1, ax2, ax3, ax4 = axes.ravel()
  12. x, y = np.random.normal(size = (2, 100))
  13. ax1.plot(x, y, "o")
  14. x = np.arange(1, 10)
  15. y = np.arange(1, 10)
  16. # plt.rcParams['axes.prop_cycle']获取颜色的字典
  17. # 会在这个范围内依次循环
  18. ncolors = len(plt.rcParams['axes.prop_cycle'])
  19. # print ncolors
  20. # print plt.rcParams['axes.prop_cycle']
  21. shift = np.linspace(1, 20, ncolors)
  22. for s in shift:
  23. # print s
  24. ax2.plot(x, y + s, "-")
  25. x = np.arange(5)
  26. y1, y2, y3 = np.random.randint(1, 25, size = (3, 5))
  27. width = 0.25
  28. # 柱状图中要显式的指定颜色
  29. ax3.bar(x, y1, width, color = "r")
  30. ax3.bar(x + width, y2, width, color = "g")
  31. ax3.bar(x + 2 * width, y3, width, color = "y")
  32. for i, color in enumerate(plt.rcParams['axes.prop_cycle']):
  33. xy = np.random.normal(size= 2)
  34. for c in color.values():
  35. ax4.add_patch(plt.Circle(xy, radius = 0.3, color= c))
  36. ax4.axis("equal")
  37. plt.show()

使用ggplot进行美化后的结果

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaojiajia007/article/details/77866313

matplotlib 画图的更多相关文章

  1. python matplotlib画图产生的Type 3 fonts字体没有嵌入问题

    ScholarOne's 对python matplotlib画图产生的Type 3 fonts字体不兼容,更改措施: 在程序中添加如下语句 import matplotlib matplotlib. ...

  2. 使用python中的matplotlib 画图,show后关闭窗口,继续运行命令

    使用python中的matplotlib 画图,show后关闭窗口,继续运行命令 在用python中的matplotlib 画图时,show()函数总是要放在最后,且它阻止命令继续往下运行,直到1.0 ...

  3. matplotlib画图

    matplotlib画图 import numpy as np import matplotlib.pyplot as plt x1=[20,33,51,79,101,121,132,145,162, ...

  4. python3 使用matplotlib画图出现中文乱码的情况

    python3使用matplotlib画图,因python3默认使用中unicode编码,所以在写代码时不再需要写 plt.xlabel(u’人数’),而是直接写plt.xlabel(‘人数’). 注 ...

  5. matplotlib画图实例:pyplot、pylab模块及作图參数

    http://blog.csdn.net/pipisorry/article/details/40005163 Matplotlib.pyplot画图实例 {使用pyplot模块} matplotli ...

  6. python使用matplotlib画图

    python使用matplotlib画图 matplotlib库是python最著名的画图库.它提供了一整套和matlab类似的命令API.十分适合交互式地进行制图. 先介绍了怎样使用matplotl ...

  7. matplotlib画图报错This figure includes Axes that are not compatible with tight_layout, so results might be incorrect.

    之前用以下代码将实验结果用matplotlib show出来 plt.plot(np.arange(len(aver_reward_list)), aver_reward_list) plt.ylab ...

  8. matplotlib画图出现乱码情况

    python3使用matplotlib画图,因python3默认使用中unicode编码,所以在写代码时不再需要写 plt.xlabel(u’人数’),而是直接写plt.xlabel(‘人数’). 注 ...

  9. python使用matplotlib画图,jieba分词、词云、selenuium、图片、音频、视频、文字识别、人脸识别

    一.使用matplotlib画图 关注公众号"轻松学编程"了解更多. 使用matplotlib画柱形图 import matplotlib from matplotlib impo ...

随机推荐

  1. PHP 判断浏览器语言

    详情请参看代码 作用:判断当前的浏览器语言.接收传入参数.拼接字符串 <?php $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2); if ...

  2. 【刷题】BZOJ 2069 [POI2004]ZAW

    Description 在Byte山的山脚下有一个洞穴入口. 这个洞穴由复杂的洞室经过隧道连接构成. 洞穴的入口是一条笔直通向"前面洞口"的道路. 隧道互相都不交叉(他们只在洞室相 ...

  3. 开源工作流程引擎ccflow多人待办处理模式的详解

    多人待办工作处理模式,也是待办处理模式.是当接受的节点是多个人的时候,如何处理待办? 根据不用的场景,ccbpm把多人在普通节点下的处理模式分为如下几种. 抢办模式: A发送到B ,B节点上有n个人可 ...

  4. 自学Zabbix13.2 分布式监控proxy配置

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix13.2 分布式监控proxy配置 分为两部分: 安装proxy 配置proxy ...

  5. 有标号的DAG计数(FFT)

    有标号的DAG计数系列 有标号的DAG计数I 题意 给定一正整数\(n\),对\(n\)个点有标号的有向无环图(可以不连通)进行计数,输出答案\(mod \ 10007\)的结果.\(n\le 500 ...

  6. redis访问安全加固

    目录 redis漏洞 入侵特征 安全隐患 redis安全规范 禁止root用户启动 限制redis文件目录访问权限 开启密码认证,设置复杂密码 禁用或重命名危险命令 设置允许监听地址,不要使用0.0. ...

  7. BCD码(如何转换,转换方式的证明)

    1. 十进制转2421码:小于4不考虑使用最高位,从最高位向最低位依次相减. 如3=2+1,为0011:7=2+4+1,为1101 2. 十进制5211码:按照最高位,次高位,最低位,次低位的顺序依次 ...

  8. gradle下载的依赖包位置 及 修改

    gradle下载的依赖包位置 2018年08月01日 00:37:06 LuckyJiang-2019 阅读数:3569   Mac系统默认下载到: /Users/(用户名)/.gradle/cach ...

  9. 窗体焦点监听事件WindowFocusListener

      public class Demo extends JFrame { JLabel label;//定义变量,以便在自定义方法类中调用 public Demo() { setBounds(100, ...

  10. ECharts图表引用json数据

    来讲两个图表,一个折线图,一个饼图. 先来看看效果图: 现在来看看代码,先来折线图,后台: (这里的后台太麻烦了,写的太多.可以使用Linq的方式,Linq比较简单写的也少.参考我的这篇文章的2018 ...