Python基础----Matplotlib

在这里插入图片描述
1、matplotlib.pyplot的基本概念

1.1、画图板/画布:

这是一个基础载体,类似实际的画图板,用pyplot.figure()函数创建,程序中允许创建多个画图板,具体操作的画板遵循就近原则(操作是在最近一次调用的画图板上实现),缺省条件下内部默认调用pyplot.figure(1)

1.2、图形区/绘图区:

用来绘图的实际区域,一般不直接获取,直接设定方式为pyplot.axes([x, y, w, h]),即axes函数直接确定了该区域在画图板/画布中的位置为x,y 尺寸为w,h

1.3、标签区:

用来展示图形相关标签的地方,该区域根据图形区进行扩展,与该区域有关联的函数是pyplot.xlabel()、pyplot.ylabel()、pyplot.title()等

1.4、相关概念比较:

1.4.1、figure (1) VS figure()

figure()操作就是创建或者调用画图板,缺省情况下系统会创建figure(1)作为画图板。使用时遵循就近原则,所有画图操作是在最近一次调用的画图板上实现。

1.4.2、axes() VS subplot()

pyplot.axes([x, y, w, h])是用来在画图板上确认图形区的位置和大小的函数,x,y表示图形区左下角相对于画图板的坐标,w,h表示图形区的宽高。(缺省时该操作在figure(1)上操作)

pyplot.subplot(abc)本质也是用来确认图形区在画图板上位置大小的函数,区别是该函数将画图板按a行b列等分,然后逐行编号,并选择编号为c的区域作为图形区用来绘图。这是一个axes()操作的高级封装,方便用户使用。subplot(233)表示2行3列的第3个位置(即,第1行第三个区域)

注:

  • subplot重复操作时如果前后两次的划分方式不一致时,会做必要的历史图形清理。
  • pyplot.show()实际展示的区域是画图板上所有图形区的最小包围区,不是整个画图板,即如果仅仅调用了subplot(224)结果只展示右下角的4号区域,而不是1、2、3、4都展示,因此会存在一定的错觉。

1.4.3、axes() VS axis()

axes([x, y, w, h])用来设定图形区

axis([x_left, x_right, y_bottom, y_top])是用来设置所绘制图形的视窗大小的,表示直接展示的图形是需要满足参数中范围的值,直观表现是绘图区实际展示的坐标范围。

注:axis作用的图形区依旧遵守就近原则。

扫描二维码关注公众号,回复: 6744186 查看本文章

1.4.4、subplot() VS plot()

subplot用来生成图形区

plot是实际使用的绘图函数,类似的函数还有hist等,plot操作遵守就近原则,即作用在最近一次使用的图形区上

1.5、缺省资源

缺省是指无主动指明的情况下,系统自动提供的资源。

画图板的缺省是:figure(1)

图形区的缺省是:subplot(111)

1.6、就近原则

就近原则:在每个函数操作时对上一层资源的依赖遵守最近原则,举例如下:

  • subplot()作用在最近使用的画图板上,有可能是缺省的画图板figure(1)。
  • axes()作用在最近使用的画图板上,有可能是缺省的画图板figure(1)。
  • axis()作用在最近使用的图形区上,可能来自subplot、axes等
  • plot()作用在最近使用的图形区上,可能来自subplot、axes等

以上内容全部引用来自博客https://blog.csdn.net/JasonZhu_csdn/article/details/85860963
博主整理的很好,非常感谢。

import numpy as np  
import matplotlib.pyplot as plt  

plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']  # 上两句一起设置显示中文
plt.rcParams['axes.unicode_minus'] = False    # 显示负号


#新建figure
fig = plt.figure()
# 定义数据
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 3, 4, 2, 5, 8, 6]
#新建区域ax1
#figure的百分比,从figure 10%的位置开始绘制, 宽高是figure的80%
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
# 获得绘制的句柄
ax1 = fig.add_axes([left, bottom, width, height])
ax1.plot(x, y, 'r')
ax1.set_title('区域1')

#新增区域ax2,嵌套在ax1内
left, bottom, width, height = 0.2, 0.55, 0.25, 0.25
# 获得绘制的句柄
ax2 = fig.add_axes([left, bottom, width, height])
ax2.plot(x,y, 'b')
ax2.set_title('area2')
plt.show() 

png

2、matplotlib.pyplot相关设置和实例

2.1、两个基本函数

plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)

参数 说明
num 图像编号或名称,数字为编号 ,字符串为名称
figsize 指定figure的宽和高,单位为英寸;
dpi 指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80
facecolor 背景颜色
edgecolor 边框颜色
frameon 是否显示边框

plt.subplots()

plt.subplots(2,3,1)表示把图标分割成2*3的网格。也可以简写plt.subplots(231)。其中,第一个参数是行数,第二个参数是列数,第三个参数表示图形的标号

2.2、线条颜色、宽度和样式设置

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

cnames1 = {
'blue':                 '#0000FF',
'blueviolet':           '#8A2BE2',
'brown':                '#A52A2A',
'burlywood':            '#DEB887',
'cadetblue':            '#5F9EA0',
'chartreuse':           '#7FFF00',
'chocolate':            '#D2691E',
'coral':                '#FF7F50',
'cornsilk':             '#FFF8DC',
'crimson':              '#DC143C',
'cyan':                 '#00FFFF',
'gold':                 '#FFD700',
'goldenrod':            '#DAA520',
'gray':                 '#808080',
'green':                '#008000',
'pink':                 '#FFC0CB',
'plum':                 '#DDA0DD',
'powderblue':           '#B0E0E6',
'purple':               '#800080',
'red':                  '#FF0000'}

clist1 = list(cnames1.values())
cnames2 = {}
for key,value in cnames1.items():
    cnames2[value] = key

Y = np.linspace(0,1,10)
X = np.ones(Y.size)
W = [0.25,0.50,0.75,1,2,3,4,5,6,7,8]
markers = ['.',',','o','v','^','<','>','1','2','3','4', 's','p','*','h','H','+','x','D','d','|','_', r'$\clubsuit$']
markers_slice = random.sample(markers, len(W))

fig = plt.figure(figsize=(18,6), dpi=72)
axes = plt.subplot(111)
 
for i,w,marker in zip(arange(len(W)),W,markers_slice):
    color = random.choice(clist1)
    
#     展示不同的颜色和线宽
#     axes.plot( (1+i)*X, Y,color = color, linewidth = w,label = cnames2[color])
    
#     展示不同的样式
    axes.plot( (1+i)*X, Y,color = color, linewidth = w,marker = marker,markersize = 16, markeredgecolor = color, markerfacecolor = color,label = cnames2[color])
    
    plt.text(i+1.1,(i+1)/len(W),cnames2[color])

    
# legend设置图例的位置
# plt.legend(loc = 'upper left')                # 展示不同的颜色和线宽

# 设置图片边界
axes.set_xlim(0,lineNumbers+1)

# 设置轴记号
# axes.set_yticks([])
axes.set_xticks(np.arange(1,lineNumbers+1))
# 更改轴标记
# axes.set_xticklabels(['%.2f' % w for w in W])   # 展示不同的颜色和线宽
axes.set_xticklabels(markers_slice)

plt.show()   

png

2.3、其他常用画图设置

plt.figure(figsize=(10,6), dpi=80)

  • plt.legend(loc=‘best’)
  • plt.xlim,plt.ylim设置轴的长短
  • plt.xticks,plt.yticks设置轴记号
  • plt.xlabel, plt.ylabel()用于添加x轴和y轴标签
  • plt.title()用于添加图的题目
  • 移动脊柱
  • plt.text()可以在图中的任意位置添加文字,并支持LaTex语法
  • plt.annotate()文本注释,在数据可视化的过程中,图片中的文字经常被用来注释图中的一些特征。使用annotate()方法可以很方便地添加此类注释。在使用annotate时,要考虑两个点的坐标:被注释的地方xy(x, y)和插入文本的地方xytext(x, y),值是相对于xy的位置而定

plt.annotate(“Important value”, xy = (55,20), xycoords=‘data’,xytext=(-5, +38), arrowprops=dict(arrowstyle=’->’))

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline 

# 创建一个 10 * 6 点(point)的图,并设置分辨率为 80
plt.figure(figsize=(10,6), dpi=80)

X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)

# label增加图例
plt.plot(X, C, color="#ADFF2F", linewidth=2.5, linestyle="-", label="cosine")
# color="red"
plt.plot(X, S, color="red",  linewidth=2.5, linestyle="-", label="sine")

# legend设置图例的位置
# axes.legend(loc='upper left')
plt.legend(loc='best')
# 设置图片边界
xmin ,xmax = X.min(), X.max()
ymin, ymax = C.min(), C.max()
dx = (xmax - xmin) * 0.2
dy = (ymax - ymin) * 0.2
plt.xlim(xmin - dx, xmax + dx)
plt.ylim(ymin - dy, ymax + dy)

# 设置轴名称和标题
plt.xlabel('x')
plt.ylabel('sine and cosine',color='red')
plt.title('test')

# # 设置轴记号
# plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
# plt.yticks([-1, 0, +1])
# 设置轴记号标签
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],[r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
plt.yticks([-1, 0, +1],[r'$-1$', r'$0$', r'$+1$'])


# # 移动脊柱
# ax = plt.gca()
# ax.spines['right'].set_color('none')
# ax.spines['top'].set_color('none')
# ax.xaxis.set_ticks_position('bottom')
# ax.spines['bottom'].set_position(('data',0))
# ax.yaxis.set_ticks_position('left')
# ax.spines['left'].set_position(('data',0))

# for label in ax.get_xticklabels() + ax.get_yticklabels():
#     label.set_fontsize(16)
#     label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65 ))


# 以分辨率 72 来保存图片
plt.savefig("exercice_1.png",dpi=80)

# 在屏幕上显示
plt.show()

png

双坐标轴设置

  • twinx()函数表示共享x轴
  • twiny()表示共享y轴

共享x轴表示的就是x轴使用同一刻度线

#!/usr/bin/python
#coding: utf-8
 
import numpy as np
import matplotlib.pyplot as plt
 
x = np.arange(1, 21, 0.1)
 
y1 = x * x
y2 = np.log(x)
 
plt.plot(x, y1)
plt.ylabel('y1 data',color = 'blue')

# 添加一条坐标轴,y轴的
plt.twinx()
plt.plot(x, y2,color = 'red')
plt.ylabel('y2 data',color = 'red')
 
plt.show()

png

2.4、散点图实例

plt.figure(figsize=(10,6), dpi=80)

axes = plt.subplot(111)

子图常用设置

  • axes.set_xlim,axes.set_ylim设置轴的长短
  • axes.set_xticks,axes.set_yticks设置轴记号
  • axes.set_xlabel, axes.set_ylabel()用于添加x轴和y轴标签
  • axes.set_title()用于添加图的题目
  • 移动脊柱
  • plt.text()可以在图中的任意位置添加文字,并支持LaTex语法
  • plt.annotate()文本注释,在数据可视化的过程中,图片中的文字经常被用来注释图中的一些特征。使用annotate()方法可以很方便地添加此类注释。在使用annotate时,要考虑两个点的坐标:被注释的地方xy(x, y)和插入文本的地方xytext(x, y)
import matplotlib.pyplot as plt
%matplotlib inline 
import numpy as np
np.random.seed(145)

plt.figure(figsize=(10,6), dpi=80)
axes = plt.subplot(111)
n = 1024
X = np.random.normal(0,1,n)
Y = np.random.normal(0,1,n)

color = np.arctan2(Y, X)

# scatter(X,Y)
axes.scatter(X, Y, s = 75, c = color, alpha = 0.5)

# 设置图片边界
xmin ,xmax = X.min(), X.max()
ymin, ymax = Y.min(), Y.max()
dx = (xmax - xmin) * 0.2
dy = (ymax - ymin) * 0.2
# plt.xlim(xmin - dx, xmax + dx)
# plt.ylim(ymin - dy, ymax + dy)
axes.set_xlim(-1.5, 1.5)
axes.set_ylim(-1.5, 1.5)

# 设置轴名称和标题
axes.set_xlabel('x')
axes.set_ylabel('random')
axes.set_title('test')

# # 设置轴记号
axes.set_xticks( np.linspace(int(xmin - 0.5*dx), int(xmax + 0.5*dx), 5,endpoint=True))
axes.set_yticks(np.linspace(int(ymin - 0.5*dy), int(ymax + 0.5*dy), 5,endpoint=True))


# # 移动脊柱
# ax = plt.gca()
# ax.spines['right'].set_color('none')
# ax.spines['top'].set_color('none')
# ax.xaxis.set_ticks_position('bottom')
# ax.spines['bottom'].set_position(('data',0))
# ax.yaxis.set_ticks_position('left')
# ax.spines['left'].set_position(('data',0))

# for label in ax.get_xticklabels() + ax.get_yticklabels():
#     label.set_fontsize(16)
#     label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65 ))


# 以分辨率 72 来保存图片
plt.savefig("exercice_2.png",dpi=80)

# 在屏幕上显示
plt.show()

png

气泡图实例

import matplotlib.pyplot as plt
%matplotlib inline 
import numpy as np
np.random.seed(145)

plt.figure(figsize=(10,6), dpi=80)

N = 200
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = (30 * np.random.rand(N))**2  

plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.show()

png

2.5、柱状图实例

fig, axes = plt.subplots(2, 2, figsize=(15, 9))

fig.subplots_adjust(wspace=0.5, hspace=0.3,left=0.125, right=0.9,top=0.9, bottom=0.1)

ax0, ax1, ax2, ax3 = axes.flatten()

fig.tight_layout() # 自动调整布局,使标题之间不重叠

import matplotlib.pyplot as plt
%matplotlib inline 
import numpy as np
np.random.seed(145)

fig, axes = plt.subplots(2, 2, figsize=(15, 9))
fig.subplots_adjust(wspace=0.5, hspace=0.3,left=0.125, right=0.9,top=0.9,    bottom=0.1)
ax0, ax1, ax2, ax3 = axes.flatten()
# fig.tight_layout() #自动调整布局,使标题之间不重叠
# fig.tight_layout()

n_bins = 10
x = np.random.randn(1000, 3)

colors = ['red', 'tan', 'lime']
ax0.hist(x, n_bins, density=True, histtype='bar', color=colors, label=colors)
ax0.legend(prop={'size': 10})
ax0.set_title('bars with legend')

ax1.hist(x, n_bins, density=True, histtype='barstacked')
ax1.set_title('stacked bar')

ax2.hist(x,  histtype='barstacked', rwidth=0.9)

ax3.hist(x[:, 0], rwidth=0.9)
ax3.set_title('different sample sizes')

plt.show()

png

2.6、条形图实例

plt.bar

import matplotlib.pyplot as plt
%matplotlib inline 
import numpy as np
np.random.seed(145)

plt.figure(figsize=(10,6), dpi=80)
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, y+0.05, '%.2f' % y, ha='center', va= 'bottom')
    
for x,y in zip(X,-Y2):
    plt.text(x, y-0.1, '%.2f' % y, ha='center', va= 'bottom')

plt.ylim(-1,+1)
plt.show()

png

2.7、颜色及线条控制

此部分内容转载自http://www.cnblogs.com/darkknightzh/p/6117528.html

字符 描述
‘-’ 实线样式
‘–’ 短横线样式
‘-.’ 点划线样式
‘:’ 虚线样式
‘.’ 点标记
‘,’ 像素标记
‘o’ 圆标记
‘v’ 倒三角标记
‘^’ 正三角标记
‘<’ 左三角标记
‘>’ 右三角标记
‘1’ 下箭头标记
‘2’ 上箭头标记
‘3’ 左箭头标记
‘4’ 右箭头标记
‘s’ 正方形标记
‘p’ 五边形标记
‘*’ 星形标记
‘h’ 六边形标记 1
‘H’ 六边形标记 2
‘+’ 加号标记
‘x’ X 标记
‘D’ 菱形标记
‘d’ 窄菱形标记
‘|’ 竖直线标记
‘_’ 水平线标记
字符 颜色
‘b’ 蓝色
‘g’ 绿色
‘r’ 红色
‘c’ 青色
‘m’ 品红色
‘y’ 黄色
‘k’ 黑色
‘w’ 白色

下面color=‘blue’中,可以换成color=’#0000FF’,每两个十六进制数分别代表R、G、B分量,下面为对应十六进制表示:

cnames = {
'aliceblue':            '#F0F8FF',
'antiquewhite':         '#FAEBD7',
'aqua':                 '#00FFFF',
'aquamarine':           '#7FFFD4',
'azure':                '#F0FFFF',
'beige':                '#F5F5DC',
'bisque':               '#FFE4C4',
'black':                '#000000',
'blanchedalmond':       '#FFEBCD',
'blue':                 '#0000FF',
'blueviolet':           '#8A2BE2',
'brown':                '#A52A2A',
'burlywood':            '#DEB887',
'cadetblue':            '#5F9EA0',
'chartreuse':           '#7FFF00',
'chocolate':            '#D2691E',
'coral':                '#FF7F50',
'cornflowerblue':       '#6495ED',
'cornsilk':             '#FFF8DC',
'crimson':              '#DC143C',
'cyan':                 '#00FFFF',
'darkblue':             '#00008B',
'darkcyan':             '#008B8B',
'darkgoldenrod':        '#B8860B',
'darkgray':             '#A9A9A9',
'darkgreen':            '#006400',
'darkkhaki':            '#BDB76B',
'darkmagenta':          '#8B008B',
'darkolivegreen':       '#556B2F',
'darkorange':           '#FF8C00',
'darkorchid':           '#9932CC',
'darkred':              '#8B0000',
'darksalmon':           '#E9967A',
'darkseagreen':         '#8FBC8F',
'darkslateblue':        '#483D8B',
'darkslategray':        '#2F4F4F',
'darkturquoise':        '#00CED1',
'darkviolet':           '#9400D3',
'deeppink':             '#FF1493',
'deepskyblue':          '#00BFFF',
'dimgray':              '#696969',
'dodgerblue':           '#1E90FF',
'firebrick':            '#B22222',
'floralwhite':          '#FFFAF0',
'forestgreen':          '#228B22',
'fuchsia':              '#FF00FF',
'gainsboro':            '#DCDCDC',
'ghostwhite':           '#F8F8FF',
'gold':                 '#FFD700',
'goldenrod':            '#DAA520',
'gray':                 '#808080',
'green':                '#008000',
'greenyellow':          '#ADFF2F',
'honeydew':             '#F0FFF0',
'hotpink':              '#FF69B4',
'indianred':            '#CD5C5C',
'indigo':               '#4B0082',
'ivory':                '#FFFFF0',
'khaki':                '#F0E68C',
'lavender':             '#E6E6FA',
'lavenderblush':        '#FFF0F5',
'lawngreen':            '#7CFC00',
'lemonchiffon':         '#FFFACD',
'lightblue':            '#ADD8E6',
'lightcoral':           '#F08080',
'lightcyan':            '#E0FFFF',
'lightgoldenrodyellow': '#FAFAD2',
'lightgreen':           '#90EE90',
'lightgray':            '#D3D3D3',
'lightpink':            '#FFB6C1',
'lightsalmon':          '#FFA07A',
'lightseagreen':        '#20B2AA',
'lightskyblue':         '#87CEFA',
'lightslategray':       '#778899',
'lightsteelblue':       '#B0C4DE',
'lightyellow':          '#FFFFE0',
'lime':                 '#00FF00',
'limegreen':            '#32CD32',
'linen':                '#FAF0E6',
'magenta':              '#FF00FF',
'maroon':               '#800000',
'mediumaquamarine':     '#66CDAA',
'mediumblue':           '#0000CD',
'mediumorchid':         '#BA55D3',
'mediumpurple':         '#9370DB',
'mediumseagreen':       '#3CB371',
'mediumslateblue':      '#7B68EE',
'mediumspringgreen':    '#00FA9A',
'mediumturquoise':      '#48D1CC',
'mediumvioletred':      '#C71585',
'midnightblue':         '#191970',
'mintcream':            '#F5FFFA',
'mistyrose':            '#FFE4E1',
'moccasin':             '#FFE4B5',
'navajowhite':          '#FFDEAD',
'navy':                 '#000080',
'oldlace':              '#FDF5E6',
'olive':                '#808000',
'olivedrab':            '#6B8E23',
'orange':               '#FFA500',
'orangered':            '#FF4500',
'orchid':               '#DA70D6',
'palegoldenrod':        '#EEE8AA',
'palegreen':            '#98FB98',
'paleturquoise':        '#AFEEEE',
'palevioletred':        '#DB7093',
'papayawhip':           '#FFEFD5',
'peachpuff':            '#FFDAB9',
'peru':                 '#CD853F',
'pink':                 '#FFC0CB',
'plum':                 '#DDA0DD',
'powderblue':           '#B0E0E6',
'purple':               '#800080',
'red':                  '#FF0000',
'rosybrown':            '#BC8F8F',
'royalblue':            '#4169E1',
'saddlebrown':          '#8B4513',
'salmon':               '#FA8072',
'sandybrown':           '#FAA460',
'seagreen':             '#2E8B57',
'seashell':             '#FFF5EE',
'sienna':               '#A0522D',
'silver':               '#C0C0C0',
'skyblue':              '#87CEEB',
'slateblue':            '#6A5ACD',
'slategray':            '#708090',
'snow':                 '#FFFAFA',
'springgreen':          '#00FF7F',
'steelblue':            '#4682B4',
'tan':                  '#D2B48C',
'teal':                 '#008080',
'thistle':              '#D8BFD8',
'tomato':               '#FF6347',
'turquoise':            '#40E0D0',
'violet':               '#EE82EE',
'wheat':                '#F5DEB3',
'white':                '#FFFFFF',
'whitesmoke':           '#F5F5F5',
'yellow':               '#FFFF00',
'yellowgreen':          '#9ACD32'}

参考学习资料:
网易云课堂一个简单实用的matplotlib视频教学讲的不错,案例基本上也都是来自菜鸟教程。

视频网址:https://study.163.com/course/courseMain.htm?courseId=1003240004

matplotlib菜鸟教程:http://www.runoob.com/w3cnote/matplotlib-tutorial.html

猜你喜欢

转载自blog.csdn.net/weixin_42432468/article/details/89268586