我想根据其中一个列表是否完成一个循环来循环浏览 2 个不同的列表。具体来说,我想更改图中数据点的符号和颜色。
这就是我目前正在做的事情:
import pandas as pd
import itertools
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
markers = itertools.cycle(['.', '1', '+', 'x'])
colors = itertools.cycle(['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))
for label, df in p_df.groupby('class'):
df.plot.scatter(x='vals', y='vals2', ax=ax, label=label, color=next(colors), marker=next(markers))
plt.legend()
但这不是我想要的,因为我在遍历标记的同时遍历颜色。我想先完成颜色迭代,然后移动到下一个标记。所以顺序是这样的
第一个情节,“。”标记,'r' 颜色
第二个情节,“。”标记,'g' 颜色
第三个图,“1”标记,“r”颜色
第 4 个图,'1' 标记,'g' 颜色
...等等
我想到的一种方法是跟踪已完成的图的数量,然后从那里调用标记上的 next。但这似乎不是一个用更多的 for 循环来迭代更复杂的绘图的好方法。
有什么建议吗?
最佳答案
这是一个常见问题,因此 matplotlib
现在包含 cycler ,用于编写此类内容。然后你可以像这样替换你的 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'}
关于python - 循环通过 2 个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57713180/