import pandas as pd
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers
import matplotlib.pyplot as plt
data=np.load('./mnist111.npz')
data.files
x_train,y_train,x_test,y_test=\
data['x_train'],data['y_train'],data['x_test'],data['y_test']
x_train,x_test=x_train/255.0,x_test/255.0
print('训练集样本',x_train.shape)
print('训练集样本',y_train.shape)
print('测试集样本',x_test.shape)
print('测试集样本',y_test.shape)
plt.figure
plt.rcParams['font.sans-serif']=['WenQuanYi Zen Hei']
plt.rcParams['axes.unicode_minus']=False
plt.imshow(x_train[0],cmap=plt.cm.binary)
plt.colorbar()
plt.grid(False)
plt.title('图片里数字是:%d'%y_train[0],size=15)
plt.show()
model=tf.keras.models.Sequential()
model.add(layers.RNN(layers.SimpleRNNCell(100),input_shape=(28,28)))
model.add(layers.Dense(10,activation='softmax'))
model.summary()
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
history=model.fit(x_train,y_train,epochs=5,validation_data=(x_test,y_test))
plt.plot(history.epoch,history.history.get('loss'),label='loss')
plt.plot(history.epoch,history.history.get('val_loss'),label='val_loss')
plt.legend()
plt.show()
plt.plot(history.epoch,history.history.get('accuracy'),label='acc')
plt.plot(history.epoch,history.history.get('val_accuracy'),label='val_acc')
plt.legend()
plt.show()
model.evaluate(x_test,y_test,verbose=2)
predictions=model.predict(x_test)
print(np.argmax(predictions[0]))
print(y_test[0])
i=4
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plt.imshow(x_test[i],cmap=plt.cm.binary)
plt.xlabel('原图片的数字是%d'%y_test[i],color='red',size=15)
plt.subplot(1,2,2)
plt.xticks(range(10),size=12)
my_plot=plt.bar(range(10),predictions[i],color='blue')
plt.ylim([0,1])
plt.show()
代码段拆解
要拆解语句 plt.title('图片里数字是:%d'%y_train[0], size=15)
的语法:
核心知识点
语法成分 | 作用 | 示例/说明 |
---|---|---|
plt.title() |
设置图表标题的函数 | 必需参数为标题文本 |
%d |
整数占位符 | 替换为 y_train[0] 的整数值 |
% 操作符 |
将变量插入字符串模板 | 右侧为单个变量或元组 |
size=15 |
设置字体大小(fontsize 的别名) |
也可用 fontsize=15 |
y_train[0] |
数据源索引 | 需确保是整数,否则报错 |
此语句通过传统字符串格式化动态生成标题,并指定字体大小,适用于快速绘图场景。
长期项目中建议改用 f-string 提升代码可维护性。
1. plt.title()
函数的作用
-
功能 :
plt.title()
是 Matplotlib 中用于设置图表标题的函数,参数包括标题文本和样式属性(如字体大小、颜色等)。 -
基本语法 :
pythonplt.title(label, fontsize=None, color=None, loc=None, **kwargs)
其中
label
是标题文本,其他参数(如size
)用于调整样式。
2. 字符串格式化部分:'图片里数字是:%d' % y_train[0]
-
%d
的作用 :
这是 C 风格格式化占位符,表示将整数插入字符串。%d
会被右侧变量替换(y_train[0]
需为整数)。 -
%
操作符的用法 :
%
左侧是字符串模板,右侧是待插入的值(单个变量或元组)。此处y_train[0]
是一个整数变量,例如:pythony_train = [5] # 示例数据 title_text = '图片里数字是:%d' % y_train[0] # 输出:'图片里数字是:5'
若
y_train[0]
非整数(如字符串),会触发TypeError
。
3. size=15
参数
- 作用 :设置标题字体大小为 15 磅(等价于
fontsize=15
)。
Matplotlib 中size
是fontsize
的常用别名,属于**kwargs
参数。 - 其他样式参数 :
类似参数包括color
(颜色)、loc
(位置,如'left'
)、fontweight
(粗细)等。
4. 语句整体解析
-
执行顺序 :
- 先执行字符串格式化:
'图片里数字是:%d' % y_train[0]
→ 生成最终标题文本(如'图片里数字是:5'
)。 - 调用
plt.title()
,传入格式化后的字符串和size=15
参数。
- 先执行字符串格式化:
-
等效代码 :
pythonformatted_title = '图片里数字是:%d' % y_train[0] # 步骤1:格式化字符串 plt.title(formatted_title, size=15) # 步骤2:设置标题
5. 注意事项与常见问题
-
类型匹配 :
y_train[0]
必须是整数,否则报错。若需兼容浮点数或字符串,可用%s
(但会失去整数格式控制)。 -
现代格式化替代方案 :
推荐使用 f-string(Python 3.6+)或str.format()
提升可读性:python# f-string 写法 plt.title(f'图片里数字是:{y_train[0]}', size=15)
-
多子图场景 :
若图表包含多个子图,plt.title()
仅设置当前子图标题;全局标题需用plt.suptitle()
。