在循环中使用plt.savefig保存多张图片使得命名不同
时间: 2024-11-15 13:33:06 浏览: 50
在Python中,如果你想要在一个循环中生成并保存多张图片,并且希望每张图都有不同的名称,你可以结合`matplotlib`库中的`savefig`函数以及字符串格式化来实现。假设你想基于一个序列(如列表、元组或迭代器)生成图片,并给它们命名为`image_0.png`, `image_1.png`, 等等,你可以这样做:
```python
import matplotlib.pyplot as plt
# 假设你有一个数据列表,比如图像索引和对应的生成数据
image_names = ['image_{:02d}.png'.format(i) for i in range(num_images)]
for index, image_name in enumerate(image_names):
# 在这里对数据进行绘图操作
data = ... # 生成你的数据
plt.figure() # 创建一个新的图形
plt.plot(data)
# 保存图片到文件
plt.savefig(image_name)
```
在这个例子中,`'{:02d}'`是一个格式化字符串,`{:02d}`表示最少填充两位数字,`i`会被替换为其整数值,从而得到像`image_00.png`, `image_01.png`, etc. 的文件名。
相关问题
解释代码: for i in range(1, len(merged_sections)): starty = merged_sections[i - 1][1] height = merged_sections[i][0] - merged_sections[i - 1][1] currentAxis = plt.gca() rect = patches.Rectangle((0, starty), 3, height, linewidth=1, edgecolor='black', facecolor='lightgray') currentAxis.add_patch(rect) fig.tight_layout() plt.savefig(output_path + '\\' + str(idx + 1) + '.jpg') plt.close('all')
这段代码是用来绘制矩形图并保存为图片的。首先,通过 `for` 循环遍历 `merged_sections` 列表的元素(从索引 1 开始),其中 `merged_sections` 是一个包含多个矩形的信息的列表。
在循环中,首先获取当前矩形的起始 y 坐标 `starty`,通过 `merged_sections[i - 1][1]` 取上一个矩形的终止 y 坐标。然后,计算当前矩形的高度 `height`,通过 `merged_sections[i][0] - merged_sections[i - 1][1]` 取当前矩形的起始 y 坐标与上一个矩形的终止 y 坐标之差。
接下来,通过 `plt.gca()` 获取当前的坐标轴对象 `currentAxis`。然后,通过 `patches.Rectangle()` 创建一个矩形对象 `rect`,指定了矩形的左上角坐标 `(0, starty)`,宽度为 3,高度为 `height`,线宽为 1,边框颜色为黑色,填充颜色为浅灰色。
然后,通过 `currentAxis.add_patch(rect)` 将矩形对象添加到当前的坐标轴中进行绘制。循环结束后,调用 `fig.tight_layout()` 可以调整子图布局使得各个图像不重叠。接着,通过 `plt.savefig(output_path + '\\' + str(idx + 1) + '.jpg')` 将绘制的图像保存到指定的路径下,并根据索引 `idx` 的值给图像命名。最后,通过 `plt.close('all')` 关闭所有的图像窗口,释放内存资源。
通过这段代码,你可以绘制多个矩形图并保存为图片,每个矩形的位置和尺寸由 `merged_sections` 列表中的元素指定。
# 统计性描述 print(df1.describe()) # 将日期转换为数字 df1['date'] = df1['date'].apply(lambda x: date2num(pd.to_datetime(x))) # 获取日期数据的最小值和最大值 date_min = mdates.date2num(df1['date'].min()) date_max = mdates.date2num(df1['date'].max()) # 绘制K线图 fig, ax = plt.subplots() ax.plot(df1['date'], df1['close'], label='Close') ax.plot(df1['date'], df1['open'], label='Open') ax.plot(df1['date'], df1['high'], label='High') ax.plot(df1['date'], df1['low'], label='Low') ax.legend() ax.set_xlabel('Date') ax.set_ylabel('Price') ax.set_title('坤彩科技') # 设置横轴的显示格式和间隔 #from matplotlib.dates import MonthLocator, DateFormatter #ax.xaxis.set_major_locator(MonthLocator()) # 设置横坐标主刻度为月份 #ax.xaxis.set_major_formatter(DateFormatter('%Y-%m')) # 设置刻度标签的格式为"年-月",可以根据需要进行修改 ax.xaxis.set_major_locator(YearLocator(base=1)) # 设置横坐标主刻度为年份 ax.xaxis.set_major_formatter(DateFormatter('%Y')) # 设置刻度标签的格式为"年" ax.xaxis.set_minor_locator(MonthLocator(bymonth=(3, 6, 9, 12))) # 设置横坐标次刻度为季度 ax.tick_params(axis='x', which='minor', labelsize=8, labelrotation=45) # 设置次刻度标签的大小和旋转角度 font = fm.FontProperties(size=10, style='italic') # 设置斜体字体属性 plt.xticks(fontproperties=font) # 设置刻度标签为斜体 plt.savefig('a1.jpg') # 保存图表 plt.show() # 显示图表 写一个循环,相同上述绘图,从1到14
可以将上述绘图的代码放在一个函数中,然后使用循环调用这个函数实现从1到14的绘图。
示例代码如下:
```python
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.dates import YearLocator, DateFormatter, MonthLocator
import matplotlib.font_manager as fm
# 定义绘制K线图的函数
def plot_k_line(df):
# 将日期转换为数字
df['date'] = df['date'].apply(lambda x: mdates.date2num(pd.to_datetime(x)))
# 获取日期数据的最小值和最大值
date_min = mdates.date2num(df['date'].min())
date_max = mdates.date2num(df['date'].max())
# 绘制K线图
fig, ax = plt.subplots()
ax.plot(df['date'], df['close'], label='Close')
ax.plot(df['date'], df['open'], label='Open')
ax.plot(df['date'], df['high'], label='High')
ax.plot(df['date'], df['low'], label='Low')
ax.legend()
ax.set_xlabel('Date')
ax.set_ylabel('Price')
ax.set_title('坤彩科技')
# 设置横轴的显示格式和间隔
ax.xaxis.set_major_locator(YearLocator(base=1)) # 设置横坐标主刻度为年份
ax.xaxis.set_major_formatter(DateFormatter('%Y')) # 设置刻度标签的格式为"年"
ax.xaxis.set_minor_locator(MonthLocator(bymonth=(3, 6, 9, 12))) # 设置横坐标次刻度为季度
ax.tick_params(axis='x', which='minor', labelsize=8, labelrotation=45) # 设置次刻度标签的大小和旋转角度
font = fm.FontProperties(size=10, style='italic') # 设置斜体字体属性
plt.xticks(fontproperties=font) # 设置刻度标签为斜体
plt.show() # 显示图表
# 循环调用绘图函数
for i in range(1, 15):
filename = f'data{i}.csv' # 根据数据文件名字生成文件路径
df = pd.read_csv(filename) # 读取数据
plot_k_line(df) # 绘制K线图
plt.savefig(f'a{i}.jpg') # 保存图表
```
注意:上述代码中需要将数据文件命名为`data1.csv`、`data2.csv`、`data3.csv`...`data14.csv`,并且放在当前目录下。
阅读全文