循环创建图形

Looping for creating graphs

我正在寻求一些指导,以了解如何最好地自动化循环以创建一些从 dict 进行的计算的图形可视化。

我拼凑了以下代码来创建一个图形,但需要生成许多相似的图形(使用不同的变量)并且不想多次输入每个变量(将有 100 个变量)。

对于单个图表,我有以下代码(见下文),其中 Calclist 是一个字典,variable1 是该字典中的特定列:

 import pandas as pd
 import numpy as np
 import matplotlib.pyplot as plt

 Sets = {}
 labels = ['0 - 5','5 - 25','25 - 50','50 - 75','75 - 100']
 blocks = [-1,5,25,50,75,100]

 for i in Calclist:

     out = pd.cut(Calclist[i]['variable1'], bins = blocks)
     Sets[i] = (pd.value_counts(out)/Calclist[i]['variable1'].count())*100

 df = pd.DataFrame(Sets)
 df.reset_index(level=0, inplace=True)
 df.rename(index = str, columns = {'index':'blocks'}, inplace=True)

 ax = df.plot.bar(title='One iteration - works well')
 ax.set_xlabel("x-axis label")
 ax.set_ylabel("y-axis label")
 ax.set_xticklabels(labels, rotation=45)

到目前为止一切顺利 - 这就是代码将产生的结果:

我真正想做的是遍历 variable1(到 variable2,variable3,.....)。

我已经尝试了几件事,我认为我很接近,但可能遗漏了一些基本的东西。

具体来说,我尝试嵌套另一个循环,该循环使用 "Parameter" 迭代一个系列,其中包含我感兴趣的可视化变量名称:

 Sets = {}
 labels = ['0 - 5','5 - 25','25 - 50','50 - 75','75 - 100']    
 blocks = [-1,5,25,50,75,100]                                

 Parameter = pd.Series("variable1","variable2")

 for j in Parameter:

     for i in Calclist:

         out = pd.cut(Calclist[i][Parameter[j]], bins = blocks)
         Sets[i] = (pd.value_counts(out)/Calclist[i]
         [Parameter[j]].count())*100

但我收到以下错误:

 TypeError: Index(...) must be called with a collection of some kind, 
 'powertotal_total' was passed

非常感谢任何和所有建议。

您不能以这种方式遍历 pandas 系列。 尝试

for j in ["variable1","variable2"]:

或它的一些变体

编辑:或查看如何遍历 pandas 系列 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.iteritems.html

您的错误消息是由您初始化的方式引起的 Parameters:

parameter = pd.Series('variable1', 'variable2')
...
TypeError: Index(...) must be called with a collection of some kind,
'variable2' was passed

您必须将类数组、字典或标量值传递给pd.Series。此外,迭代 Parameters 将 return 它的值。最后,您应该为每个 parameter:

初始化 Sets
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

labels = ['0 - 5','5 - 25','25 - 50','50 - 75','75 - 100']
blocks = [-1,5,25,50,75,100]

Parameters = pd.Series(['variable1', 'variable2'])

for parameter in Parameters:
    Sets = {}
    for i in Calclist:
        out = pd.cut(Calclist[i][parameter], bins = blocks)
        Sets[i] = (pd.value_counts(out)/Calclist[i][parameter].count())*100

    df = pd.DataFrame(Sets)
    df.reset_index(level=0, inplace=True)
    df.rename(index=str, columns={'index': 'blocks'}, inplace=True)

    ax = df.plot.bar(title=parameter)
    ax.set_xlabel("x-axis label")
    ax.set_ylabel("y-axis label")
    ax.set_xticklabels(labels, rotation=45)