【问题标题】:How can I synch up the colors for each iteration in a loop that plots successive curves in Matplotlib?如何在 Matplotlib 中绘制连续曲线的循环中同步每次迭代的颜色?
【发布时间】:2020-05-03 21:46:20
【问题描述】:

我有以下代码来绘制阻尼振荡器的多个值的解:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
x = np.linspace(0, 50, 1000)
plt.figure(figsize=(9,7.5))
for mu in range(40,100,14):
  plt.plot(x, np.exp(-(mu/500) * x), linestyle='--',alpha=0.4)
  plt.plot(x, -np.exp(-(mu/500) * x), linestyle='--',alpha=0.4)
  plt.plot(x, np.sin(np.sqrt(1 - ((mu/100)**2)) * x)*np.exp(-(mu/500) * x))

(输出图见下)

问题是 Pyplot 似乎在每次迭代中随机分配 3 条曲线的颜色(即 mu 的每个值),但我希望颜色可以“同步”,也就是说mu 的第一个值,np.exp(-(mu/500)-np.exp(-(mu/500) * x)np.sin(np.sqrt(1 - ((mu/100)**2)) * x)*np.exp(-(mu/500) * x) 的曲线相同(或接近)。

我通过使用 RGB 颜色元组在每次迭代中设置颜色,然后每次递增元组中的值来破解它,但这很乏味,而且您必须将增量与循环的迭代次数联系起来会通过吗?

有没有更优雅、更简洁的方法可以处理任意数量的迭代?

【问题讨论】:

标签: python python-3.x matplotlib seaborn


【解决方案1】:

作为对@pink spikyhairman 评论中答案的补充,您可以通过在其中输入mu/mumax 来定义颜色图并获取颜色:

# define mus outside of loop
mus = np.arange(40,100,14)
cmap = plt.cm.viridis

for mu in mus:

  # define color as colormap entry between 0 and 1
  color = cmap(mu/np.max(mus))  

  plt.plot(x, np.exp(-(mu/500) * x), linestyle='--',alpha=0.4, c=color)
  plt.plot(x, -np.exp(-(mu/500) * x), linestyle='--',alpha=0.4, c=color)
  plt.plot(x, np.sin(np.sqrt(1 - ((mu/100)**2)) * x)*np.exp(-(mu/500) * x), c=color)

【讨论】:

    【解决方案2】:

    来自matplotlib.pyplot.plot documentation

    默认情况下,每一行都被指定了一个不同的样式 '风格循环'。仅需要 fmt 和 line 属性参数 如果您想明确偏离这些默认值。或者, 您还可以使用“axes.prop_cycle”更改样式周期 rcParam.

    您可以创建一个带有重复颜色参数的cycler 对象,并通过set_prop_cycle 将其传递给坐标区对象,例如:

    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    from cycler import cycler
    sns.set()
    x = np.linspace(0, 50, 1000)
    fig, ax = plt.subplots(1, figsize=(9,7.5))
    ax.set_prop_cycle(cycler('color', 'rrrbbb'))
    for mu in range(40,40+28,14):
        ax.plot(x, np.exp(-(mu/500) * x), linestyle='--',alpha=0.4)
        ax.plot(x, -np.exp(-(mu/500) * x), linestyle='--',alpha=0.4)
        ax.plot(x, np.sin(np.sqrt(1 - ((mu/100)**2)) * x)*np.exp(-(mu/500) * x))
    

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      相关资源
      最近更新 更多