# matplotlib
官方文档: https://matplotlib.org/ (opens new window)
# 创建图表
import matplotlib
import matplotlib.pyplot as plt
"""风格设置"""
import seaborn as sns
sns.set(style="whitegrid")
"""中文显示设置 方式1"""
font = {'family':'serif'} #设置使用的字体(需要显示中文的时候使用)
matplotlib.rc('font',**font) #设置显示中文,与字体配合使用
"""负数显示设置"""
""" 创建图表
m: 子图行数 n: 子图列数 a: 图像宽度 b: 图像高度
"""
fig, ax = plt.subplots(m, n, figsize=(a, b))
"""显示图表"""
plt.show()
# 基本图像绘制
# 散点图 scatter
"""
x (list): x 坐标列表
y (list): y 坐标列表
label (int/str): 属于的系列 (便于绘制图例)
alpha (number): 透明度 0-1
edgecolors (str): 散点轮廓线颜色
"""
ax.scatter(x, y, c=colors[i], label=labels[i], alpha=1, edgecolors='none')
# 折线图 plot
"""
x (list): x 坐标列表
y (list): y 坐标列表
label (int/str): 属于的系列 (便于绘制图例)
linestyle/ls (str): 折线形状类型
linewidth/lw (str): 折线宽度
alpha (number): 透明度 0-1
marker (str): 标记类型
ms (number): 标记大小
mec: 标记边缘颜色 marker edge color
mfc: 标记内部颜色 marker face color
"""
ax.plot(x, y, label=labels[j], color=colors[j], linestyle=linestyles[j], lw=lws[j])
ax.plot(x, s2_array[:,j+1], c=colors[j], linestyle="--", label=labels[j], alpha=0.4, marker="o", ms=4, linewidth=1)
"""折线平滑数据预处理
n (int): 将区间数据切分的段数
"""
from scipy.interpolate import make_interp_spline
xnew = np.linspace(min(x), max(x), n)
ysmooth = make_interp_spline(x, y)(xnew)
# 柱状图 bar
ax.bar(x, y, width=width, label=labels[j], color=colors[j])
# 箱线图 boxplot
"""
array (2D array): 箱线图数据 箱子数*箱子内数据条目数
labels (list): 系列列表
widths (float): 箱子宽度百分比
"""
bp = ax.boxplot(array, labels=labels, widths=0.6, patch_artist=True)
## 箱体设置
for k, box in enumerate(bp['boxes']):
box.set(color=colors_box[k], edgecolor='black', linewidth=1, alpha=0.05)
box.set_facecolor(colors_box[k], alpha=0.05)
box.edgecolor("black")
## 轮廓线设置
for k, whisker in enumerate(bp['whiskers']):
whisker.set(color="lightgray", linewidth=1, linestyle='--')
# 热力图 matshow
"""
aw (2D array/list) : 权重矩阵 m*n
"""
ax.matshow(aw, interpolation='nearest', cmap='YlOrRd') # 根据 aw 权重矩阵绘制热力图
for (j, k), l in np.ndenumerate(aw):
ax.text(k, j, '{:0.3f}'.format(l), ha='center', va='center') # 为每个小方块添加文字
# 图表设置
# 基本设置 grid
ax.grid(False) # 关闭坐标轴格
# 标题 title
"""
title (str): 子图标题
fontsize (int): 字体大小
x (float): x 轴百分比位置
y (float): y 轴百分比位置
"""
ax.set_title(title, fontsize=15)
# 坐标轴名称 label
ax.set_xlabel(xlabel)
ax.set_ylabel(ylabel)
# 坐标轴刻度 tick
"""设置坐标轴刻度显示
tick_spacing(int/float): 坐标轴间隔
ticks_list(list): 坐标轴刻度
"""
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing)) # 设置坐标轴间隔
ax.yaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
ax.set_xticklabels(ticks_list, rotation=40) # 设置坐标轴刻度
ax.set_yticklabels(ticks_list)
"""设置坐标轴刻度精度
"""
import matplotlib.ticker as ticker
from matplotlib.ticker import FormatStrFormatter
ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f'))
# 图例 legend
plt.legend(ncol=3, loc=(-0.9, -0.5), frameon=True)
## 设置 legend 字体
leg = plt.gca().get_legend() #或leg=ax.get_legend()
ltext = leg.get_texts()
plt.setp(ltext, fontsize=13,fontweight='bold')
# 添加文本 text
plt.text(x, y, text, fontsize=16, rotation=90)
# 子图间距 adjust
plt.subplots_adjust(left=0.2, bottom=0.1, right=0.9, top=0.85, wspace=0.3, hspace=0.3) # 按照百分比调整子图间距
# 颜色|标记|线型|设置 color marker linestyle
参考: https://www.biaodianfu.com/matplotlib-plot.html (opens new window)
常用颜色缩写:
- b: 蓝色 (blue)
- g: 绿色 (green)
- r: 红色 (red)
- c: 青色 (cyan)
- m: 品红 (magenta)
- y: 黄色 (yellow)
- k: 黑色 (black)
- w: 白色 (white)
常用cmap名称:
- GnBu: 蓝绿色调
- YlOrRd: 红橙色调
- hot_r: 红色调
常用标记符号:
.: 点 (point marker)
,: 像素点 (pixel marker)
o: 圆形 (circle marker)
v: 朝下三角形 (triangle_down marker)
^: 朝上三角形 (triangle_up marker)
<: 朝左三角形 (triangle_left marker)
: 朝右三角形 (triangle_right marker)
1: (tri_down marker)
2: (tri_up marker)
3: (tri_left marker)
4: (tri_right marker)
s: 正方形 (square marker)
p: 五边星 (pentagon marker)
*: 星型 (star marker)
h: 1号六角形 (hexagon1 marker)
H: 2号六角形 (hexagon2 marker)
+: +号标记 (plus marker)
x: x号标记 (x marker)
D: 菱形 (diamond marker)
d: 小型菱形 (thin_diamond marker)
|: 垂直线形 (vline marker)
_: 水平线形 (hline marker)
常用线型:
- -: 实线(solid line style)
- –: 虚线(dashed line style)
- -.: 点划线(dash-dot line style)
- :: 点线(dotted line style)
# 文件导出
fig.savefig("attn.png", transparent=True, dpi=600)
fig.savefig('3-temporal.pdf',dpi=600) # 存储为pdf文件 便于论文显示位图