gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:59:45 24 4
gpt4 key购买 nike

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

          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

接下来,我将生成 2 行和 2 列的子图,以显示 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]

在指定特定实验室条件的每个子图中,我想绘制不同类型样本的 aT 的值。为了区分样本的种类,我为它们分配了不同的颜色和标记。所以这是我的绘图脚本:

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。如果我从迭代列表中删除第一项,它只会绘制第一个变量(蓝色三角形中的种类 II)。

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

(请注意,这也发生在我的真实数据上,所以问题不应该出在我生成示例的方式上。)

最佳答案

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

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 上测试。

关于python - 循环中的散点图仅绘制第一次迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44234565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com