如何在循环的每次迭代中将新图形保存为 png

Posted

技术标签:

【中文标题】如何在循环的每次迭代中将新图形保存为 png【英文标题】:How do I save a new graph as png with every iteration of a loop 【发布时间】:2016-08-11 19:17:09 【问题描述】:

我不知道如何使用 NetworkX 为循环的每次迭代保存一个新的图形 png。我从这个问题中借用了代码:in NetworkX cannot save a graph as jpg or png file 并对其进行了一些操作。下面是代码:

import networkx as nx
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(12,12))
ax = plt.subplot(111)
ax.set_title('Graph - Shapes', fontsize=10)

G = nx.DiGraph()
G.add_node('shape1', level=1)
G.add_node('shape2', level=2)
G.add_node('shape3', level=2)
G.add_node('shape4', level=3)
G.add_edge('shape1', 'shape2')
G.add_edge('shape1', 'shape3')
G.add_edge('shape3', 'shape4')
pos = nx.spring_layout(G)
n = 0
colorses = ['yellow', 'red', 'blue', 'green']
while n < len(colorses):
    nx.draw(G, pos, node_size=1500, node_color=colorses[n], font_size=8, font_weight='bold')
    plt.tight_layout()
    # plt.show()
    plt.savefig("Graph.png", format="PNG")
    n += 1

理想情况下,我希望有四张图片,每张图片都有不同的颜色节点。如果您需要更多信息,请告诉我。谢谢!

【问题讨论】:

嗯...如果每次迭代都更改文件名怎么办,所以让"Graph.png" 依赖于n,比如plt.savefig("Graph.png".format(n), format="PNG") 【参考方案1】:

只需更改输出文件的名称

while n < len(colorses):
    nx.draw(G, pos, node_size=1500, node_color=colorses[n], font_size=8, font_weight='bold')
    plt.tight_layout()
    # plt.show()
    plt.savefig("Graph" + str(n) +".png", format="PNG")
    n += 1

不过,您应该使用更具描述性的名称。也许不是 n,你可以参考一个时间

    plt.savefig("Graph" + str(datetime.datetime.now()) +".png", format="PNG")

这不是很好,因为字符串会有空格,但你可以预先调整它

【讨论】:

【参考方案2】:

第一个建议,通过索引值访问颜色不是“Pythonic”。相反,使用for 循环:

for color in colors:
    print(color)

您的代码在循环的每次迭代中都会覆盖Graph.png。要为每次迭代保存一个新文件,只需在每次迭代时重命名输出文件。一种方法是使用format() 和enumerate() 函数:

import networkx as nx                                                                                             
import matplotlib.pyplot as plt                                             

fig = plt.figure(figsize=(12,12))                                           
ax = plt.subplot(111)                                                       
ax.set_title('Graph - Shapes', fontsize=10)                                 

G = nx.DiGraph()                                                            
G.add_node('shape1', level=1)                                               
G.add_node('shape2', level=2)                                               
G.add_node('shape3', level=2)                                               
G.add_node('shape4', level=3)                                               
G.add_edge('shape1', 'shape2')                                              
G.add_edge('shape1', 'shape3')                                              
G.add_edge('shape3', 'shape4')                                              
pos = nx.spring_layout(G)                                                   
colors = ['yellow', 'red', 'blue', 'green']                                 
for i, color in enumerate(colors):                                          
    nx.draw(G, pos, node_size=1500, node_color=color, font_size=8, font_weight='bold')
    plt.tight_layout()                                                      
    plt.savefig('Graph_.png'.format(i), format="PNG")                     

【讨论】:

【参考方案3】:

顺便说一句,我刚刚使用了这种方法,并且我添加了一个步骤,以便我的标签来自我的文件名。我希望它可以帮助某人。

    files = glob.glob(folder+'\\'+'*.csv', recursive=False)
    for file in files:
        df1=pd.read_csv(file,header=1,sep=',')
        nslice = (sum(1 for line in open(file))-1)/3
        base = print(os.path.splitext(os.path.basename(file))[0])
        fig = plt.figure()
        ax = plt.subplot(111)
        c = ax.plot(df1.iloc[0:int(nslice)-1,[22]],df1.iloc[0:int(nslice)-1,[4]],label='Cuticle')
        t = ax.plot(df1.iloc[int(nslice):(int(nslice)-1)*2,[22]],df1.iloc[int(nslice):(int(nslice)-1)*2,[4]],label='Tissue')
        p = ax.plot(df1.iloc[int(nslice)*2:(int(nslice)-1)*3,[22]],df1.iloc[int(nslice)*2:(int(nslice)-1)*3,[4]],label='Phenanthrene')
        title_obj = plt.title(base)
        plt.xlabel("Slice #")
        plt.ylabel("Avg MGV")
        ax.legend()
        plt.savefig('plot'+str(os.path.splitext(os.path.basename(file))[0])+'.png')
        plt.show()
        plt.close('all')

和平

【讨论】:

以上是关于如何在循环的每次迭代中将新图形保存为 png的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Matlab 中将线阵列保存为图形

在 MATLAB 中将输出图形保存为 png 文件

如何在循环中的每次迭代中保存具有不同名称的文件? MATLAB

Labview在循环的每次迭代中将数据写入Excel文件

如何在R中将highchart保存为PNG图像?

在bash中将循环的每次迭代的输出附加到相同的内容