【数学建模美赛M奖速成系列】Matplotlib绘图技巧(一)

发布时间:2023年12月26日

写在前面

前面我们讲过,好的图表在论文写作中是相当重要的,这里学姐为大家整理了一些Matplotlib快速入门内容以及论文绘图的技巧,帮助大家快速学习绘图。这里整理了完整的文档与技巧,有需要的同学看下面,另外,如果没有美赛经验想要获奖,欢迎咨询哦~

1 基本绘图实例:sin、cos函数图

from pylab import *
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 256,
endpoint=True)
c, s = np.cos(x), np.sin(x)
plt.plot(x, c)
plt.plot(x, s)
show()

在这里插入图片描述

2 plot()函数详解

调用形式一般为:

plot([x], y, [fmt], data=None, *kwargs)
plot([x], y, [fmt], [x2], y2, [fmt2],,
*kwargs)

其中可选参数[fmt]是一个字符串,用于定义图的基本属性:颜色(color)、点型(marker)、线型(linestyle)
具体形式为:

fmt = [color][marker][linestyle]
注意这里的三个属性只能是每个属性的单个字母缩写,若属性用的是全名则不能用[fmt]

**kwargs参数:

  • x: x轴数据
  • y: y轴数据
  • linewidth: 线宽
  • color:线条颜色

在这里插入图片描述

  • marker: 标记风格

在这里插入图片描述

  • linestyle: 线条样式

在这里插入图片描述

  • markerfacecolor 标记颜色
  • markersize 标记大小
from pylab import *
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 256,
endpoint=True)
c, s = np.cos(x), np.sin(x)
plt.plot(x, c, 'b|-')
plt.plot(x, s)
show()

在这里插入图片描述

3 matplotlib中绘图的默认配置

from pylab import *
import numpy as np
import matplotlib.pylab as plt
# 创建一个8*6(point)的图,并设置分辨率为80
figure(figsize=(8, 6), dpi=80)
# 创建一个新的1*1的子图,接下来的图样绘制在其中的第一块中
subplot(1, 1, 1)
# 得到坐标点(x,y)坐标
X = np.linspace(-np.pi, np.pi, 256,
endpoint=True)
C, S = np.cos(X), np.sin(X)
# 绘制余弦曲线,使用蓝色的、连续的、宽度为1的线条
plot(X, C, color='blue', linewidth=2.5,
linestyle='-')
# 绘制正弦曲线,使用绿色的、连续的、宽度为1的线条
plot(X, S, color='green', linewidth=2.0,
linestyle='-')
# 设置横轴的上下限
xlim(-4.0, 4.0)
# 设置横轴记号
xticks(np.linspace(-4, 4, 9, endpoint=True),
fontproperties='Times New Roman', size=20)
# 设置纵轴记号
yticks(np.linspace(-1, 1, 5, endpoint=True))
#设置横纵坐标的名称以及对应字体格式
font = {'family' : 'Times New Roman',
'weight' : 'normal',
'size' : 20,
}
# 设置横轴标签
plt.xlabel('X axis', font)
# 设置纵轴标签
plt.ylabel('Y axis', font)
# 设置图像标题
plt.title('Demo Figure', font)
# 以分辨率72来保存图片
savefig('demo.png', dpi=72)
# 在屏幕上显示
show()

在这里插入图片描述

4 设置图的横纵坐标的上下界

xlim(), ylim()
from pylab import *
import numpy as np
# 得到坐标点(x,y)坐标
X = np.linspace(-np.pi, np.pi, 256,
endpoint=True)
C, S = np.cos(X), np.sin(X)
x_min, x_max = X.min(), X.max()
c_min, c_max = C.min(), C.max()
s_min, s_max = S.min(), C.max()
y_min, y_max = min(c_min, s_min), max(c_max,
s_max)
# 设置横纵坐标上下界的偏移量,这样能够完整的显示图像且最美观
dx = (x_max - x_min) * 0.2
dy = (y_max - y_min) * 0.2
# 设置上下限
xlim(x_min - dx, x_max + dx)
ylim(y_min - dy, y_max + dy)
# 绘制余弦曲线,使用蓝色的、连续的、宽度为2.5的线条
plot(X, C, color='blue', linewidth=2.5,
linestyle='-')
# 绘制正弦曲线,使用绿色的、连续的、宽度为2.0的线条
plot(X, S, color='green', linewidth=2.0,
linestyle='-')
show()

在这里插入图片描述

5 设置横纵坐标上的记号

xticks(), yticks()

这两个函数的用处在于指明横纵轴需要显示的内容和显示内容的位置,参数的值可以有两种情况:

  • 当横纵坐标的值为普通的数字时:参数为一个list,list中的元素为数字,此时两个函数的参数只需要这一个list
  • 当横纵坐标的值为公式(使用的latex中的公式表示,如’pipipi’)或其他和当前的坐标值不同的值时:参数为两个list,第一个list为普通数字对应的是纵坐标值,第二个list为第一个list中纵坐标位置对应要显示的值,可以是公式也可以是其他和当前纵坐标值不同的表示
from pylab import *
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 256,
endpoint=True)
c, s = np.cos(x), np.sin(x)
xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
[r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$',
r'$+\pi$'])
yticks([-1, 0, +1],
[r'$-1$', r'$0$', r'$+1$'])
plt.plot(x, c)
plt.plot(x, s)
show()

在这里插入图片描述

6 调整图像的脊柱

坐标轴和上面的记号连在一起就形成了脊柱(Spines,一条线段上又一系列凸起,是不是很像脊柱),它记录了数据区域的范围,它们可以放在任意位置,不过默认是放在图的四边。
实际上每幅图都有四条脊柱(上下左右),为了将脊柱放在图的中间,我们必须将其中的两条(上和右)设置为无色,然后调整剩下的两条到合适的位置——数据空间的0点。

from pylab import *
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 256,
endpoint=True)
c, s = np.cos(x), np.sin(x)
plt.plot(x, c)
plt.plot(x, s)
# 设置坐标轴gca(),获取坐标轴信息
ax = gca()
'''
使用ax.spines[]选定边框,使用set_color()将选定的边框的颜
色设为 none
'''
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
'''
移动坐标轴,将bottom即x坐标轴移动到y=0的位置
ax.xaixs为x轴,set_ticks_position()用于从上下左右
(top/bottom/left/right)四条脊柱中选择一个作为x轴
使用set_position()设置边框位置:y=0的位置。位置的所有属性
包括:outward、axes、data
'''
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
'''
将left 即y坐标轴设置到x=0的位置
'''
ax.yaxis.set_ticks_position('left') # 选定y轴
ax.spines['left'].set_position(('data', 0))
plt.show()

在这里插入图片描述

7 添加图例

在 plot() 函数中增加一个参数 label ,再通过 legend()函数显示图例

from pylab import *
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 256,
endpoint=True)
c, s = np.cos(x), np.sin(x)
plt.plot(x, c, label='cosine')
plt.plot(x, s, label='sine')
plt.legend(loc='upper left')
plt.show()

在这里插入图片描述

8 给一些特殊点加注释

scatter(x, y, s=None, c=None, marker=None,
cmap=None, norm=None, vmin=None, vmax=None,
alpha=None, linewidths=None, verts=None,
edgecolors=None, hold=None, data=None, *kwargs)
x - x 值
向量
y - y 值
向量
sz - 标记面积
36 (默认) | 数值标量 | 行或列向量 | []
c - 标记颜色
[0 0 1] (默认) | RGB 三元数 |RGB 三元数组成的三列
矩阵 | 向量 | 'r' | 'g' | 'b' | .
mkr - 标记类型
'o' (默认) | '+' | '*' | '.' | 'x' | .
'filled' - 用于填充标记内部的选项
ax - 目标坐标区
Axes 对象 | PolarAxes 对象
'MarkerEdgeColor' - 标记轮廓颜色
'flat' (默认) | 'none' | RGB 三元数 | 'r' | 'g' |
'b' | .
'MarkerFaceColor' - 标记填充颜色
'none' (默认) | 'flat' | 'auto' | RGB 三元数 | 'r'
| 'g' | 'b' | .
'LineWidth' - 标记边缘的宽度
0.5 (默认) | 正值
s - Scatter 对象
Scatter 对象

函数用于在图像中绘制散点

参数:

  • x/y:都是向量形式,且维度相同,分别对应坐标点的横纵坐标
  • scalar: 标记大小,以平方磅为单位的标记面积,可以有一下形式:
    • 数值标量 : 以相同的大小绘制所有标记。
    • 行或列向量 : 使每个标记具有不同的大小。x、y 和 sz中的相应元素确定每个标记的位置和面积。sz 的长度必须等于 x 和 y 的长度。
    • [] : 使用 36 平方磅的默认面积。
  • color:标记的颜色,有下列不同的赋值方式:
    • RGB 三元数或颜色名称 - 使用相同的颜色绘制所有标记。
    • 由 RGB 三元数组成的三列矩阵 - 对每个标记使用不同的颜色。矩阵的每行为对应标记指定一种 RGB 三元数颜色。行数必须等于 x 和 y 的长度
    • 向量 - 对每个标记使用不同的颜色,并以线性方式将 c 中的值映射到当前颜色图中的颜色。c 的长度必须等于 x 和y 的长度。要更改坐标区的颜色图,请使用 colormap 函数。如果散点图中有三个点,并且您希望这些颜色成为颜色图的索引,请以三元素列向量的形式指定 c。
    • 在这里插入图片描述
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'}
  • marker: 标记样式

在这里插入图片描述

  • edgecolors: 轮廓颜色,参数形式和color类似
  • alpha: 透明度,值在[0, 1]范围内,1表示不透明,0表示透明
  • linewidths: 线宽,表示标记边缘的宽度,默认是"face"
  • cmap: 自定义色彩盘,实际上就是一个三列的矩阵,shape为 [N,3][N, 3][N,3],一个实例可以参考matplotlib使用自己想要的color map

annotate(s, xy, *args, **kwargs)
函数用于在图形上给数据点添加文本注解,而且支持带箭头的划线工具,方便我们在合适的位置添加描述信息。具体的内容可以参考Matplotlib中的annotate用法
参数:

  • s: 注释文本中的内容
  • color: 注释文本的颜色
  • xy: 被注释的坐标点,二维元组形式(x, y)
  • xytext: 注释文本的坐标点,也是二维元组(x, y)形式
  • xycoords: 被注释的坐标系属性,允许输入的值如下图:
    在这里插入图片描述
  • textcoords: 注释文本的坐标系属性,默认与xycoords属性值相同,除了允许输入xycoords的属性值,还允许输入以下两种:

在这里插入图片描述

  • arrowprops: 用于标注的箭头的样式,这个参数是一个dict类型的数据。如果该属性为空,则会在注释文本和被注释点之间画一个箭头。箭头的样式可以通过 arrowstyle 关键字来指定默认的可选类型, arrowstyle 关键字包含的默认类型包括以下:
    在这里插入图片描述
    如果没有 arrowstyle 关键字,则箭头的样式可以由以下关键字指定(注意 arrowstyle 和以下关键字不能同时存在)
    在这里插入图片描述
    箭头、坐标点和注释文本之间的关系属性包括如下图。其中connectionstyle属性用于控制注释点和注释文本之间的连接线的属性,比如弧度,角度之类的信息,这里还不是太清楚。
    在这里插入图片描述
from pylab import *
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 256,
endpoint=True)
c, s = np.cos(x), np.sin(x)
plt.plot(x, c)
plt.plot(x, s)
# 调整图像的脊柱
ax = 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') # 选定y轴
ax.spines['left'].set_position(('data', 0))
# 在2*np.pi/3的位置给两条函数曲线加上一个注释
t = 2 * np.pi / 3
plt.plot([t, t], [0, np.cos(t)], color='blue',
linewidth=2.5,linestyle=' -')
scatter([t, ], [np.cos(t), ], 50, color='blue')
annotate(r'$\sin(\frac{2\pi}{3})=\frac{\sqrt{3}}
{2}$',
xy=(t, np.sin(t)), xycoords='data',
xytext=(+10, +30), textcoords='offset
points', fontsize=16,
arrowprops=dict(arrowstyle="->",
connectionstyle="arc3,rad=.2"))
plot([t,t],[0,np.sin(t)], color ='red',
linewidth=2.5, linestyle=" -")
scatter([t,],[np.sin(t),], 50, color ='red')
annotate(r'$\cos(\frac{2\pi}{3})=-\frac{1}
{2}$',color='green',
xy=(t, np.cos(t)), xycoords='data',
xytext=(-90, -50), textcoords='offset
points', fontsize=16,
arrowprops=dict(arrowstyle="->",
connectionstyle="arc3,rad=.2")) # arc, angle,
armA, rad
show()

在这里插入图片描述

9 子图

图像的属性包括以下几个:
在这里插入图片描述

from pylab import *
'''
subplot()函数的参数中,除最后一维的其他维表示子图的大小,最
后一维表示当前子图在图像中的位置,如下实例,在2*2的网格里,
第四个子图为(2, 2, 4)
创建横跨多个位置的子图用gridspec实现
'''
"""
添加多个固定大小的子图:
fig = plt.figure(figsize=(10, 10), dpi=80,
facecolor='red')
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 4)
ax1.plot() .
ax2.plot() .
"""
subplot(2,2,1)
xticks([]), yticks([])
text(0.5,0.5,
'subplot(2,2,1)',ha='center',va='center',size=20,
alpha=.5)
subplot(2,2,2)
xticks([]), yticks([])
text(0.5,0.5,
'subplot(2,2,2)',ha='center',va='center',size=20,
alpha=.5)
subplot(2,2,3)
xticks([]), yticks([])
text(0.5,0.5,
'subplot(2,2,3)',ha='center',va='center',size=20,
alpha=.5)
subplot(2,2,4)
xticks([]), yticks([])
text(0.5,0.5,
'subplot(2,2,4)',ha='center',va='center',size=20,
alpha=.5)
# savefig(' ./figures/subplot-grid.png', dpi=64)
show()

在这里插入图片描述

from pylab import *
import matplotlib.gridspec as gridspec
# gridspec的用法,可以使图像横跨多个坐标
G = gridspec.GridSpec(3, 3)
axes_1 = subplot(G[0, :])
xticks([]), yticks([])
text(0.5,0.5, 'Axes
1',ha='center',va='center',size=24,alpha=.5)
axes_2 = subplot(G[1,:-1])
xticks([]), yticks([])
text(0.5,0.5, 'Axes
2',ha='center',va='center',size=24,alpha=.5)
axes_3 = subplot(G[1:, -1])
# 确定了这个子图的位置之后,就可以直接在上面画图,直到创建了
下个新的子图
x = np.linspace(-np.pi, np.pi, 256,
endpoint=True)
c, s = np.cos(x), np.sin(x)
plt.plot(x, c)
plt.plot(x, s)
#xticks([]), yticks([])
#text(0.5,0.5, 'Axes
3',ha='center',va='center',size=24,alpha=.5)
axes_4 = subplot(G[-1,0])
xticks([]), yticks([])
'''
text()函数用于在图像上的特定位置加上一些文本,用于注释
'''
text(0.5,0.5, 'Axes
4',ha='center',va='center',size=24,alpha=.5)
axes_5 = subplot(G[-1,-2])
xticks([]), yticks([])
text(0.5,0.5, 'Axes
5',ha='center',va='center',size=24,alpha=.5)
#plt.savefig(' ./figures/gridspec.png', dpi=64)
show()

在这里插入图片描述

from pylab import *
'''
使用axes()函数来确定当前子图的位置和大小,参数为一个
list[x, y, width, height],
x,y为当前子图的左下角坐标位置,width为子图的宽度,
height为子图的高度
'''
axes([0.1,0.1,0.8,0.8])
xticks([]), yticks([])
text(0.6,0.6,
'axes([0.1,0.1,.8,.8])',ha='center',va='center',s
ize=20,alpha=.5)
axes([0.2,0.2,.3,.3])
x = np.linspace(-np.pi, np.pi, 256,
endpoint=True)
c, s = np.cos(x), np.sin(x)
plt.plot(x, c)
plt.plot(x, s)
# xticks([]), yticks([])
# text(0.5,0.5,
'axes([0.2,0.2,.3,.3])',ha='center',va='center',s
ize=16,alpha=.5)
# plt.savefig(" ./figures/axes.png",dpi=64)
show()

在这里插入图片描述

from pylab import *
axes([0.1,0.1,.5,.5])
xticks([]), yticks([])
text(0.1,0.1,
'axes([0.1,0.1,.5,.5])',ha='left',va='center',siz
e=16,alpha=.5)
axes([0.2,0.2,.5,.5])
xticks([]), yticks([])
text(0.1,0.1,
'axes([0.2,0.2,.5,.5])',ha='left',va='center',siz
e=16,alpha=.5)
axes([0.3,0.3,.5,.5])
x = np.linspace(-np.pi, np.pi, 256,
endpoint=True)
c, s = np.cos(x), np.sin(x)
plt.plot(x, c)
plt.plot(x, s)
# xticks([]), yticks([])
# text(0.1,0.1,
'axes([0.3,0.3,.5,.5])',ha='left',va='center',siz
e=16,alpha=.5)
axes([0.4,0.4,.5,.5])
xticks([]), yticks([])
text(0.1,0.1,
'axes([0.4,0.4,.5,.5])',ha='left',va='center',siz
e=16,alpha=.5)
# plt.savefig(" ./figures/axes-2.png",dpi=64)
show()

最后

这里整理了完整的文档与技巧,有需要的同学看下面,另外,如果没有美赛经验想要获奖,欢迎咨询哦~
在这里插入图片描述

在这里插入图片描述

文章来源:https://blog.csdn.net/Magnolia_He/article/details/135219635
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。