当值超过某个 y 值时,是否可以更改图中的线条颜色?例子:
import numpy as np
import matplotlib.pyplot as plt
a = np.array([1,2,17,20,16,3,5,4])
plt.plt(a)
这个给出了以下内容:
我想可视化超过 y=15 的值。类似于下图:
或者像这样的东西(循环线型): :
是否可以?
原文由 Mpizos Dimitris 发布,翻译遵循 CC BY-SA 4.0 许可协议
当值超过某个 y 值时,是否可以更改图中的线条颜色?例子:
import numpy as np
import matplotlib.pyplot as plt
a = np.array([1,2,17,20,16,3,5,4])
plt.plt(a)
这个给出了以下内容:
我想可视化超过 y=15 的值。类似于下图:
或者像这样的东西(循环线型): :
是否可以?
原文由 Mpizos Dimitris 发布,翻译遵循 CC BY-SA 4.0 许可协议
定义一个辅助函数(这是一个基本的函数,可以添加更多的功能)。此代码是对文档中 此示例 的轻微重构。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib.colors import ListedColormap, BoundaryNorm
def threshold_plot(ax, x, y, threshv, color, overcolor):
"""
Helper function to plot points above a threshold in a different color
Parameters
----------
ax : Axes
Axes to plot to
x, y : array
The x and y values
threshv : float
Plot using overcolor above this value
color : color
The color to use for the lower values
overcolor: color
The color to use for values over threshv
"""
# Create a colormap for red, green and blue and a norm to color
# f' < -0.5 red, f' > 0.5 blue, and the rest green
cmap = ListedColormap([color, overcolor])
norm = BoundaryNorm([np.min(y), threshv, np.max(y)], cmap.N)
# Create a set of line segments so that we can color them individually
# This creates the points as a N x 1 x 2 array so that we can stack points
# together easily to get the segments. The segments array for line collection
# needs to be numlines x points per line x 2 (x and y)
points = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)
# Create the line collection object, setting the colormapping parameters.
# Have to set the actual values used for colormapping separately.
lc = LineCollection(segments, cmap=cmap, norm=norm)
lc.set_array(y)
ax.add_collection(lc)
ax.set_xlim(np.min(x), np.max(x))
ax.set_ylim(np.min(y)*1.1, np.max(y)*1.1)
return lc
使用示例
fig, ax = plt.subplots()
x = np.linspace(0, 3 * np.pi, 500)
y = np.sin(x)
lc = threshold_plot(ax, x, y, .75, 'k', 'r')
ax.axhline(.75, color='k', ls='--')
lc.set_linewidth(3)
和输出
如果您只希望标记改变颜色,请使用相同的范数和 cmap 并将它们传递给散点图
cmap = ListedColormap([color, overcolor])
norm = BoundaryNorm([np.min(y), threshv, np.max(y)], cmap.N)
sc = ax.scatter(x, y, c=c, norm=norm, cmap=cmap)
原文由 tacaswell 发布,翻译遵循 CC BY-SA 3.0 许可协议
1 回答9.6k 阅读✓ 已解决
2 回答5.2k 阅读✓ 已解决
2 回答3.6k 阅读✓ 已解决
3 回答4.5k 阅读
3 回答1.3k 阅读✓ 已解决
4 回答1.3k 阅读✓ 已解决
2 回答1.6k 阅读✓ 已解决
不幸的是,matplotlib 没有一个简单的选项来改变一条线的一部分的颜色。我们将不得不自己编写逻辑。诀窍是将线切割成线段的集合,然后为每条线段分配一种颜色,然后绘制它们。
你的第二个选择要容易得多。我们首先画线,然后在其上添加标记作为散点图: