每个记录的matplotlib汇总图

每个记录的matplotlib汇总图,matplotlib,summary,arcpy,Matplotlib,Summary,Arcpy,我需要为数据库中的每条记录创建单个参数的摘要图。使用下面的代码,我成功地为每个记录创建了一个子图(测试数据库中的5个,ArcGIS 10.0文件地理数据库,Python 2.6.5,Matplotlib 1.0.0),但每个子图都是相同的。我在论坛上搜索了摘要图/报告、子图语法和循环技术的示例,试图确定正确的语法。我认为我的问题是循环语法不正确,因为我正在每个绘图绘制所有记录,而不是每个绘图绘制所需的一条记录。在我解决了这个基本的绘图问题之后,我计划扩展我的代码范围,包括每个绘图10-15个参数

我需要为数据库中的每条记录创建单个参数的摘要图。使用下面的代码,我成功地为每个记录创建了一个子图(测试数据库中的5个,ArcGIS 10.0文件地理数据库,Python 2.6.5,Matplotlib 1.0.0),但每个子图都是相同的。我在论坛上搜索了摘要图/报告、子图语法和循环技术的示例,试图确定正确的语法。我认为我的问题是循环语法不正确,因为我正在每个绘图绘制所有记录,而不是每个绘图绘制所需的一条记录。在我解决了这个基本的绘图问题之后,我计划扩展我的代码范围,包括每个绘图10-15个参数,总共3-4个绘图,以及一些一般的摘要信息,所有这些都在每个记录的单页pdf中。我总共有几千张唱片

这是我关于堆栈溢出的第一篇文章。在过去的一年里,该论坛在许多场合对我都是非常有用的资源。我不熟悉python,也不熟悉使用matplotlib,但我看到了该语言和该库的巨大潜力。非常感谢您的任何帮助或建议

import arcpy
import os
import matplotlib
import matplotlib.pyplot as plt

#Variables
FC = arcpy.GetParameterAsText(0) #feature class
P1_fld = arcpy.GetParameterAsText(1) #score field to chart
P2_fld = arcpy.GetParameterAsText(2) #score field to chart
plt.subplots_adjust(hspace=0.4)
nsubp = int(arcpy.GetCount_management(FC).getOutput(0)) #pulls n subplots from FC
last_val = object()

#Sub-plot loop
cur = arcpy.SearchCursor(FC, "", "", P1_fld)
for row in cur:
    x=1
    y=row.getValue(P1_fld)
    if row.OBJECTID != last_val:
        for i,v in enumerate(xrange(nsubp)):
            v = v+1
            i = i+1
            ax = plt.subplot(nsubp,1,v) # Create a subplot.
            ax.scatter(x,y,s=5,color='blue'); # Generate the Scatter Plot.
            oid = str(row.getValue('OBJECTID'))
            figPDf = r"filepath.pdf" # Save the Scatter Plot to PDF.
            plt.savefig(figPDf)
del row, cur
os.startfile("filepath.pdf")

发生这种情况是因为有两个嵌套的
for
循环:第一个循环迭代每个
,而第二个循环使散点图出现在每个子批次上。这反过来意味着每个打印的参数将出现在每个子地块上。要避免这种情况,应该避免双
for
循环

我不确定我是否完全理解你想要实现的目标,但这至少会让你走上正轨

import arcpy
import os
import matplotlib
import matplotlib.pyplot as plt

#Variables
FC = arcpy.GetParameterAsText(0) #feature class
P1_fld = arcpy.GetParameterAsText(1) #score field to chart
P2_fld = arcpy.GetParameterAsText(2) #score field to chart
plt.subplots_adjust(hspace=0.4)
nsubp = int(arcpy.GetCount_management(FC).getOutput(0)) #pulls n subplots from FC
last_val = object()

#Sub-plot loop
cur = arcpy.SearchCursor(FC, "", "", P1_fld)
i = 0
x = 1
for row in cur:
    y = row.getValue(P1_fld)
    if row.OBJECTID != last_val:
        i += 1
        ax = plt.subplot(nsubp, 1, i) # Create a subplot.
        ax.scatter(x, y, s=5, color='blue'); # Generate the Scatter Plot.
        oid = str(row.getValue('OBJECTID'))
        figPDf = r"filepath.pdf" # Save the Scatter Plot to PDF.
        plt.savefig(figPDf)
del row, cur
os.startfile("filepath.pdf")

在enumerate(xrange(nsubp))中组合i,v:v=v+1和i=i+1似乎很麻烦发生这种情况是因为您对循环使用了双
:您正在绘制每个迭代(即每个子批)的所有参数。您完全正确。我的双for循环导致了问题。当我删除第二个for循环并合并您的编辑时,5个绘图只显示一条记录的值。为了让每个记录值自己绘制,我还需要删除'if row.OBJECTID'语句并删除下面的所有内容。脚本现在为每个记录提供了一个唯一的绘图,这正是我所需要的。非常感谢,诺德夫!