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作用的图形区依旧遵守就近原则。
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()
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()
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()
双坐标轴设置
- 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()
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()
气泡图实例
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()
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()
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()
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