Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.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 循环浏览2个列表_Python_Matplotlib - Fatal编程技术网

Python 循环浏览2个列表

Python 循环浏览2个列表,python,matplotlib,Python,Matplotlib,我想根据其中一个列表是否完成了一个循环,循环浏览2个不同的列表。具体来说,我想更改绘图中数据点的符号和颜色 这就是我目前正在做的: 将熊猫作为pd导入 进口itertools 导入seaborn作为sns 将matplotlib.pyplot作为plt导入 %matplotlib内联 markers=itertools.cycle(['.','1','+','x']) colors=itertools.cycle(['r','g']) 类别=[“类别1”]*5+[“类别2”]*5+[“类别3”]

我想根据其中一个列表是否完成了一个循环,循环浏览2个不同的列表。具体来说,我想更改绘图中数据点的符号和颜色

这就是我目前正在做的:

将熊猫作为pd导入
进口itertools
导入seaborn作为sns
将matplotlib.pyplot作为plt导入
%matplotlib内联
markers=itertools.cycle(['.','1','+','x'])
colors=itertools.cycle(['r','g'])
类别=[“类别1”]*5+[“类别2”]*5+[“类别3”]*7
VAL=[1,1.2,1.3,1.4,1.5]+[2,2.2,2.3,2.4,2.5]+[3,3.1,3.2,3.3,3.4,3.5,3.6]
VAL2=[x**2表示VAL中的x]
p_df=pd.DataFrame({“class”:classes,“vals”:vals,“vals2”:vals2})
图,ax=plt.子批次(图尺寸=(8,6))
对于标签,p_df.groupby('class')中的df:
df.plot.scatter(x='vals',y='vals2',ax=ax,label=label,color=next(颜色),marker=next(标记))
plt.legend()
但这并不是我想要的,因为我和颜色同时迭代标记。我想先完成颜色的迭代,然后移动到下一个标记。所以序列是这样的

第一个绘图,'.'标记,'r'颜色

第二个绘图,'.'标记,'g'颜色

第三个绘图,“1”标记,“r”颜色

第四个绘图,“1”标记,“g”颜色

。。。等等

我想到的一种方法是跟踪已经完成的绘图数量,然后从那里调用下一个marker。但这似乎不是一个好方法来迭代更复杂的绘图和更多的for循环进行绘图

有什么建议吗?

使用:

正如在一条评论中指出的那样(很抱歉,由于它已被删除,所以不能使用属性),如果您需要重用组合,您可以始终将其包装在
itertools.cycle()
中:


这是一个常见的问题,因此
matplotlib
现在包括,用于编写此类内容。然后可以像这样替换
itertools.cycles

import pandas as pd
from cycler import cycler
import seaborn as sns
import matplotlib.pyplot as plt

markers = cycler(marker='.1+x')
colors = cycler(color='rg')

style = iter(markers * colors)

classes = ["class 1"] * 5 + ["class 2"] * 5 + ["class 3"] * 7
vals = [1,1.2,1.3,1.4,1.5] + [2,2.2,2.3,2.4,2.5] + [3,3.1,3.2,3.3,3.4,3.5,3.6]
vals2 = [x**2 for x in vals]
p_df = pd.DataFrame({"class": classes, "vals": vals, "vals2": vals2})

fig, ax = plt.subplots(figsize=(8,6))
for label, df in p_df.groupby('class'):
    df.plot.scatter(x='vals', y='vals2', ax=ax, label=label, **next(style))
plt.legend()
要查看循环是如何组成的,您可以执行以下操作

for i in (markers * colors):
    print(i)
哪张照片

{'marker': '.', 'color': 'r'}
{'marker': '.', 'color': 'g'}
{'marker': '1', 'color': 'r'}
{'marker': '1', 'color': 'g'}
{'marker': '+', 'color': 'r'}
{'marker': '+', 'color': 'g'}
{'marker': 'x', 'color': 'r'}
{'marker': 'x', 'color': 'g'}

Matplotlib的循环器
允许在属性中自动循环。但这只适用于
绘图
(不适用于
分散
)。但是,使用
绘图
可以更有效地生成单色散射

import pandas as pd
import matplotlib.pyplot as plt


markers = plt.cycler(marker=['.', '1', '+', 'x'])
colors = plt.cycler(color=['r', 'g'])

classes = ["class 1"] * 5 + ["class 2"] * 5 + ["class 3"] * 7
vals = [1,1.2,1.3,1.4,1.5] + [2,2.2,2.3,2.4,2.5] + [3,3.1,3.2,3.3,3.4,3.5,3.6]
vals2 = [x**2 for x in vals]
p_df = pd.DataFrame({"class": classes, "vals": vals, "vals2": vals2})

fig, ax = plt.subplots(figsize=(8,6))
ax.set_prop_cycle(markers*colors)
for label, df in p_df.groupby('class'):
    ax.plot("vals", "vals2", linestyle="", data=df)
plt.legend()
plt.show()

islice(cycle(product(markers,colors)),N)如果你想让他们按照这个模式重复计数N,或者如果这就是你想要的。谢谢你推荐包装器。
{'marker': '.', 'color': 'r'}
{'marker': '.', 'color': 'g'}
{'marker': '1', 'color': 'r'}
{'marker': '1', 'color': 'g'}
{'marker': '+', 'color': 'r'}
{'marker': '+', 'color': 'g'}
{'marker': 'x', 'color': 'r'}
{'marker': 'x', 'color': 'g'}
import pandas as pd
import matplotlib.pyplot as plt


markers = plt.cycler(marker=['.', '1', '+', 'x'])
colors = plt.cycler(color=['r', 'g'])

classes = ["class 1"] * 5 + ["class 2"] * 5 + ["class 3"] * 7
vals = [1,1.2,1.3,1.4,1.5] + [2,2.2,2.3,2.4,2.5] + [3,3.1,3.2,3.3,3.4,3.5,3.6]
vals2 = [x**2 for x in vals]
p_df = pd.DataFrame({"class": classes, "vals": vals, "vals2": vals2})

fig, ax = plt.subplots(figsize=(8,6))
ax.set_prop_cycle(markers*colors)
for label, df in p_df.groupby('class'):
    ax.plot("vals", "vals2", linestyle="", data=df)
plt.legend()
plt.show()