python - 循环通过 2 个列表

标签 python matplotlib

我想根据其中一个列表是否完成一个循环来循环浏览 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/

相关文章:

python - 属性错误 : 'Flask' object has no attribute 'user_options'

python - Pyspark Dataframe 插补——根据指定条件用列平均值替换未知值和缺失值

python - Matplotlib 极坐标直方图已移动箱

python - 将文本添加到python中的图例

python - csv2rec 和 polyfit 的问题

Python - 为 3d 线图着色

python - 基于键和值的嵌套字典的条件递归搜索

Python Opencv SolvePnP 产生错误的翻译向量

python - 获取矩形内圆的轮廓

python - 具有彩色高度的 Matplotlib 3D 瀑布图