【问题标题】:How to plot one curve in two different colors? (NOT using pandas) [duplicate]如何用两种不同的颜色绘制一条曲线? (不使用熊猫)[重复]
【发布时间】:2019-04-01 10:18:11
【问题描述】:

我需要使用matplotlib.pyplot 创建一个绘图,显示地球和火星之间的距离随时间的变化。除此之外还有几个月,例如3 月至 8 月应以与其他月份不同的颜色显示。 数据由包含日期、距离以及指示日期是否在 3 月到 8 月跨度内的标志的数组提供。

包含整个数据的数组称为master_array。第一列包含日期,第二列包含距离;第七个 s/w 标志。 ('s' 代表夏天,'w' 代表冬天)。

我尝试利用pyplot.plot 为每个.plot 命令切换颜色的事实,我首先绘制冬季月份,然后再绘制夏季月份。

import numpy as np
from matplotlib import pyplot as plt

def md_plot2(dt64=np.array, md=np.array):
    """Erzeugt Plot der Marsdistanz (y-Achse) zur Zeit (x-Achse)."""
    plt.style.use('seaborn-whitegrid')

    y, m, d = dt64.astype(int) // np.c_[[10000, 100, 1]] % np.c_[[10000, 100, 100]]
    dt64 = y.astype('U4').astype('M8') + (m-1).astype('m8[M]') + (d-1).astype('m8[D]')

    wFilter = np.argwhere(master_array[:,6] == 0)
    sFilter = np.argwhere(master_array[:,6] == 1)

    plt.plot(dt64[wFilter], md[wFilter], label='Halbjahr der fallenden \nTemperaturen')
    plt.plot(dt64[sFilter], md[sFilter], label='Halbjahr der steigenden \nTemperaturen')

    plt.xlabel("Zeit in Jahren\n")
    plt.xticks(rotation = 45)
    plt.ylabel("Marsdistanz in AE\n(1 AE = 149.597.870,7 km)")
    plt.legend(loc='upper right', frameon=True)

plt.figure('global betrachtet...') # diesen Block ggf. auskommentieren
#plt.style.use('seaborn-whitegrid')
md_plot2(master_array[:,0], master_array[:,1]) # Graph

plt.show()
#plt.close()

现在的问题是,在夏季的最后一个点和下一个夏季的第一个点之间,夏季图显示了一条线,而另一个图(冬季)显示了介于两者之间的冬季的正确数据两个夏天。 数据包含许多数据点,这将导致这两种颜色的许多段。 当下一个数据点在未来一天以上时,如何停止绘图以绘制一条线? 是否有其他pyplot 的方法可以完成这项任务?

由于我在不使用 pandas 的情况下在属于该脚本的脚本中编写了很多代码,因此我很高兴找到一个不使用 pandas 的问题的解决方案,因为我试图避免它,因为我不想让我的脚本膨胀当有办法通过使用我已经在使用的模块完成任务时。我还读到它会降低速度here

【问题讨论】:

  • 对您在不需要时不使用 Pandas 的理念表示敬意——毕竟,在这种情况下它可能甚至没有帮助!
  • 您需要将数据“切割”成多个部分,例如用相同的颜色分别绘制每个夏天,然后也分别绘制每个冬天。这样,您将跳过连接线。另一种解决方案是将所有冬季值设置为np.nan,然后为所有夏季绘制夏季线,然后为冬季执行相反的操作。
  • @AKX 谢谢!我现在添加这个免责声明,因为这个项目中的每个人都建议使用 pandas,现在这是最后一个问题(希望)要解决,它完全可以在没有任何 pandas 行的情况下工作¯\_(ツ)_/¯
  • 看起来this question 将是您所追求的。当然它确实使用了 pandas,因为这使它更简单一些。我不完全理解您在此处使用的自定义日期时间格式,因此如果您需要进一步的帮助,也许您想解释一下输入 dt64 是什么,以及它与日期的关系。
  • 我用一段不使用 pandas 的新代码更新了 the original question 的答案。

标签: python python-3.x numpy matplotlib plot


【解决方案1】:

multicolored_line 示例看起来像您想要的那样。

另请参阅this article,了解有关 Matplotlib 中颜色图系统的更多信息。

【讨论】:

  • 这对我来说更像是评论而不是实际答案。也许这最终证明是重复的?
  • 我知道这是一个仅限链接的答案,但我觉得从链接文章中复制示例和图表并不值得。
  • @AKX 你能为我的情况解释一下multicolored_line 的以下部分吗? points = np.array([x, y]).T.reshape(-1, 1, 2) segments = np.concatenate([points[:-1], points[1:]], axis=1) 我不知道如何为我的代码自定义这些部分。
  • 详细说明:我不知道如何自定义行 segments = np.concatenate([points[:-1], points[1:]], axis=1) 在我的情况下...
【解决方案2】:

这是一个简单的,只是“覆盖”你想要另一种颜色的部分:

import matplotlib.pyplot as plt
%matplotlib inline
x = list(range(10))
y = [ 2*i for i in x]
x_1 = x[4:7]
y_1 = y[4:7]
plt.plot(x,y)
plt.plot(x_1,y_1)
plt.show()

【讨论】:

  • 好主意,但如果您有很多段,则不方便。此外,它不会涵盖问题代码中不需要的行。
猜你喜欢
  • 2013-02-07
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 2013-06-18
  • 1970-01-01
相关资源
最近更新 更多