【发布时间】:2020-01-02 21:47:06
【问题描述】:
我想根据其中一个列表是否完成一个循环来循环浏览 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 循环进行绘图的更复杂绘图的好方法。
有什么建议吗?
【问题讨论】:
-
islice(cycle(product(markers, colors)), N) 如果您希望他们遵循该模式并重复计数 N。或者只是 docs.python.org/3.4/library/itertools.html#itertools.product 如果这就是您想要的。跨度>
标签: python matplotlib