Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 循环中的散点图仅绘制第一次迭代_Python_Matplotlib_Scatter - Fatal编程技术网

Python 循环中的散点图仅绘制第一次迭代

Python 循环中的散点图仅绘制第一次迭代,python,matplotlib,scatter,Python,Matplotlib,Scatter,我试图在散点图中绘制几个不同的东西,通过有几个子图并迭代剩余的类别,但是这些图只显示第一次迭代,没有抛出任何错误。为了澄清,以下是数据实际外观的示例: a kind state property T 0 0.905618 I dry prop1 10 1 0.050311 I wet prop1 20 2 0.933696 II dry prop1 30 3 0.114824 III wet prop

我试图在散点图中绘制几个不同的东西,通过有几个子图并迭代剩余的类别,但是这些图只显示第一次迭代,没有抛出任何错误。为了澄清,以下是数据实际外观的示例:

          a kind state property   T
0  0.905618    I   dry    prop1  10
1  0.050311    I   wet    prop1  20
2  0.933696   II   dry    prop1  30
3  0.114824  III   wet    prop1  40
4  0.942719   IV   dry    prop1  50
5  0.276627   II   wet    prop2  10
6  0.612303  III   dry    prop2  20
7  0.803451   IV   wet    prop2  30
8  0.257816   II   dry    prop2  40
9  0.122468   IV   wet    prop2  50
我就是这样生成这个例子的:

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

kinds = ['I','II','III','IV']
states = ['dry','wet']
props = ['prop1','prop2']
T = [10,20,30,40,50]
a = np.random.rand(10)
k = ['I','I','II','III','IV','II','III','IV','II','IV']
s = ['dry','wet','dry','wet','dry','wet','dry','wet','dry','wet']
p = ['prop1','prop1','prop1','prop1','prop1','prop2','prop2','prop2','prop2','prop2']
t = [10,20,30,40,50,10,20,30,40,50]
df = pd.DataFrame(index=range(10),columns=['a','kind','state','property','T'])
df['a']=a
df['kind']=k
df['state']=s
df['property']=p
df['T']=t
print df
接下来,我将生成两行两列的子地块,以显示干湿状态下property1和property2的变量。因此,我基本上将数据帧分割成几个较小的数据帧,如下所示:

first = df[(df['state']=='dry')&(df['property']=='prop1')]
second = df[(df['state']=='wet')&(df['property']=='prop1')]
third = df[(df['state']=='dry')&(df['property']=='prop2')]
fourth = df[(df['state']=='wet')&(df['property']=='prop2')]
dfs = [first,second,third,fourth]
for no, df in enumerate(dfs):
    ax = fig.add_subplot(gs[no])
    for i, r in enumerate(kinds):
        #print i, r
        df2 = df[df['kind']==r]
        c = colours[i]
        m = symbols[i]
        plt.scatter(df2['T'],df2['a'],c=c,s=50.0, marker=m, edgecolor='k')

    ax = plt.xlabel('T')
    ax = plt.xticks(T)
    ax = plt.ylabel('A')
    ax = plt.title(titles[no],fontsize=12,alpha=0.75)
在这些子批次中,每个子批次都指定了特定的实验室条件,我想为不同种类的样品绘制a与T的值。为了区分样本的种类,我给它们分配了不同的颜色和标记。这是我的绘图脚本:

fig = plt.figure(figsize=(8,8.5))
gs = gridspec.GridSpec(2,2, hspace=0.4, wspace=0.3)
colours = ['r','b','g','gold'] 
symbols = ['v','v','^','^']
titles=['dry 1','wet 1','dry 2','wet 2']
for no, df in enumerate(dfs):
    ax = fig.add_subplot(gs[no])
    for i, r in enumerate(kinds):
        #print i, r
        df = df[df['kind']==r]
        c = colours[i]
        m = symbols[i]
        plt.scatter(df['T'],df['a'],c=c,s=50.0, marker=m, edgecolor='k')

    ax = plt.xlabel('T')
    ax = plt.xticks(T)
    ax = plt.ylabel('A')
    ax = plt.title(titles[no],fontsize=12,alpha=0.75)
plt.show()
但结果只绘制了第一次迭代,在本例中是红色三角形中的I类。如果我从迭代列表中删除第一项,它只会以蓝色三角形绘制第一个变量kind II

我做错了什么? 该图看起来像这样,但我希望每个子地块都相应地填充红色、蓝色、绿色和金色标记。


请注意,这也发生在我的真实数据中,因此问题不应该出现在我生成示例的方式中。

您的问题存在于内部for循环中。通过写入df=df[df['kind']==r],您可以使用为I过滤的版本替换原始df。然后,在循环的下一次迭代中,您将为II过滤,没有找到进一步的数据。因此,您也不会收到错误消息,因为代码在其他方面是“正确的”。如果您像这样重写相关的代码:

first = df[(df['state']=='dry')&(df['property']=='prop1')]
second = df[(df['state']=='wet')&(df['property']=='prop1')]
third = df[(df['state']=='dry')&(df['property']=='prop2')]
fourth = df[(df['state']=='wet')&(df['property']=='prop2')]
dfs = [first,second,third,fourth]
for no, df in enumerate(dfs):
    ax = fig.add_subplot(gs[no])
    for i, r in enumerate(kinds):
        #print i, r
        df2 = df[df['kind']==r]
        c = colours[i]
        m = symbols[i]
        plt.scatter(df2['T'],df2['a'],c=c,s=50.0, marker=m, edgecolor='k')

    ax = plt.xlabel('T')
    ax = plt.xticks(T)
    ax = plt.ylabel('A')
    ax = plt.title(titles[no],fontsize=12,alpha=0.75)

它应该很好用。在Python 3.5上测试。

您的问题在于内部for循环。通过写入df=df[df['kind']==r],您可以使用为I过滤的版本替换原始df。然后,在循环的下一次迭代中,您将为II过滤,没有找到进一步的数据。因此,您也不会收到错误消息,因为代码在其他方面是“正确的”。如果您像这样重写相关的代码:

first = df[(df['state']=='dry')&(df['property']=='prop1')]
second = df[(df['state']=='wet')&(df['property']=='prop1')]
third = df[(df['state']=='dry')&(df['property']=='prop2')]
fourth = df[(df['state']=='wet')&(df['property']=='prop2')]
dfs = [first,second,third,fourth]
for no, df in enumerate(dfs):
    ax = fig.add_subplot(gs[no])
    for i, r in enumerate(kinds):
        #print i, r
        df2 = df[df['kind']==r]
        c = colours[i]
        m = symbols[i]
        plt.scatter(df2['T'],df2['a'],c=c,s=50.0, marker=m, edgecolor='k')

    ax = plt.xlabel('T')
    ax = plt.xticks(T)
    ax = plt.ylabel('A')
    ax = plt.title(titles[no],fontsize=12,alpha=0.75)

它应该很好用。在Python3.5上测试。

您应该在问题中编写此注释,编辑它,而不是将其作为注释发布。我认为您的问题在于这一行:df=df[df['kind']==r]。它位于内部for循环中,这意味着外部for循环的原始df被覆盖。尝试将其重命名为,例如df2=df[df['kind']==r]和plt.scatterdf2['T'],df2['a'],c=c,s=50.0,marker=m,edgecolor='k'。你应该在你的问题中写下这个评论,编辑它,而不是将它作为评论发布。我认为你的问题在这行:df=df[df['kind']==r]。它位于内部for循环中,这意味着外部for循环的原始df被覆盖。尝试将其重命名为,例如df2=df[df['kind']==r]和plt.scatterdf2['T'],df2['a'],c=c,s=50.0,marker=m,edgecolor='k'。