【问题标题】:Change matplotlib line style mid-graph更改 matplotlib 线型中间图
【发布时间】:2012-03-06 07:01:21
【问题描述】:

我正在绘制一些数据(两条线),并且我想更改它们之间差异具有统计显着性的线部分的线型。因此,在下图中(现在链接 b/c 反垃圾邮件政策不允许我发布图像)我希望线条看起来不同(即可能是虚线),直到它们在 35 点左右开始收敛x 轴。

line plot

有没有办法轻松做到这一点?我有 x 轴的值,其中差异很大,我只是不清楚如何更改某些 x 轴位置的线条样式。

【问题讨论】:

  • 每条曲线绘制两个图怎么样?一个带有第一组点(在值开始收敛之前),然后另一个带有第二组点。只需将绘图设置为具有相同的样式(颜色、标记等),线条样式除外! :)
  • 谢谢,我试试这个。我还有一些其他的情节,这些情节稍后在循环进入和失去意义时再次分歧。这意味着我会有一堆绘图命令,但希望我能把它整理出来。
  • @RicardoCardenes- 我建议您将您的评论作为答案,以便它可以被赞成/接受。这是正确的做法:-)
  • 您可以大量自动化它。看我的回答。
  • @DavidRobinson:我知道,我知道,我没有因为评论而获得 +2k ;)。只是有时我觉得我的评论不值得回答:)

标签: python styles matplotlib line graphing


【解决方案1】:

编辑:我已经打开并离开了,所以我没有注意到@Ricardo 的回答。因为 matplotlib 无论如何都会将事物转换为 numpy 数组,所以有更有效的方法来做到这一点。

举个例子:

只需绘制两条不同的线,一条为虚线,另一条为实线。

例如

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y1 = 2 * x
y2 = 3 * x

xthresh = 4.5
diff = np.abs(y1 - y2)
below = diff < xthresh
above = diff >= xthresh

# Plot lines below threshold as dotted...
plt.plot(x[below], y1[below], 'b--')
plt.plot(x[below], y2[below], 'g--')

# Plot lines above threshold as solid...
plt.plot(x[above], y1[above], 'b-')
plt.plot(x[above], y2[above], 'g-')

plt.show()

对于循环的情况,使用掩码数组:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y1 = 2 * np.cos(x)
y2 = 3 * np.sin(x)

xthresh = 2.0
diff = np.abs(y1 - y2)
below = diff < xthresh
above = diff >= xthresh

# Plot lines below threshold as dotted...
plt.plot(np.ma.masked_where(below, x), np.ma.masked_where(below, y1), 'b--')
plt.plot(np.ma.masked_where(below, x), np.ma.masked_where(below, y2), 'g--')

# Plot lines above threshold as solid...
plt.plot(np.ma.masked_where(above, x), np.ma.masked_where(above, y1), 'b-')
plt.plot(np.ma.masked_where(above, x), np.ma.masked_where(above, y2), 'g-')

plt.show()

【讨论】:

  • 正在考虑类似的事情,但不知何故决定以复杂的方式进行:D。很好:)
  • 很高兴我刚刚刷新了这个。只是在考虑使用掩码数组。非常有帮助。感谢大家的洞察力。
  • @Ohm - 它使用 numpy 的布尔索引(below 是一个布尔数组,例如[True, True, False, False, True])来仅选择xy 的区域,其中diff &lt; xthresh。例如,如果x = np.arange(10),我们做了print x[x &lt; 5],我们会得到[0, 1, 2, 3, 4]。但是,这假设我们有一条包含大量样本的行。如果你有x = array([0, 1]) 而你有x[x &lt; 0.5],你只会得到0,而不是[0, 0.499999]。它只是选择给定条件为真的离散点,而不是插值。
  • @Ohm - 是的,但您需要改用掩码数组。这是一个简单的例子:gist.github.com/joferkington/3ca60b0b05b7310f09e8
【解决方案2】:

假设您的数据位于 NumPy 数组 dataset1dataset2 上,并且您已将 threshold 定义为重要意义

def group(data):
    """Assumes that len(data) > 0"""
    prev = 0
    index = 1
    value = data[0]

    while (index < len(data)):
        if data[index] != value:
            yield (value, prev, index)

            value = not value
            prev = index
        index += 1

    yield (value, prev, index)

diff = np.abs(dataset1 - dataset2)
for significant, start, end in group(diff < threshold):
   # Plot data from dataset1[start:end] and dataset2[start:end]
   # Use the value in "significant" (True/False) to figure out
   # The style

【讨论】:

  • 我想我可以使用来自itertools 的东西来缩短它,但我想这已经足够好了:P
猜你喜欢
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 2019-12-31
  • 2013-09-08
  • 2014-02-14
  • 1970-01-01
相关资源
最近更新 更多