matplotlib fill_between在面域之间保留间隙

wbgh16ku  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(184)

我尝试使用fill_between来填充绘图的不同区域,但在尝试填充的区域之间出现间隙。
我尝试过使用interpolate=True,但这会导致非矩形形状...
`

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
x = np.arange(0, 4 * np.pi, 0.01)
y = np.sin(x)
ax.plot(x, y, color='black')

threshold = 0.75
ax.axhline(threshold, color='green', lw=2, alpha=0.7)
ax.fill_between(x, 0, 1, where=y > threshold,
                facecolor=(0.5,0,0,0.5), ec=None,transform=ax.get_xaxis_transform())

ax.fill_between(x, 0, 1, where=y <= threshold,
                facecolor=(0,0.5,0,0.5), ec=None, transform=ax.get_xaxis_transform())

'我附上了一张放大的图截图。

w8f9ii69

w8f9ii691#

您可以执行以下一项或两项操作:
1.使用更精细的x值,例如x = np.arange(0, 4 * np.pi, 0.0001)。这将在全视图中删除白色条纹,但如果放大,它们将在特定缩放级别重新出现。
1.首先在整个x范围内绘制绿色背景(不带where条件),然后在所需部分绘制红色部分。如果是非不透明颜色(如示例中所示),则需要手动重新计算默认白色背景上的半透明颜色,使其成为完全不透明的颜色:

x = np.arange(0, 4 * np.pi, 0.001)

    # ...

    ax.fill_between(x, 0, 1, facecolor=(0, 0.5, 0, 0.5), ec=None,
                    transform=ax.get_xaxis_transform())
    ax.fill_between(x, 0, 1, where=y>threshold, facecolor=(0.75, 0.5, 0.5),
                    ec=None, transform=ax.get_xaxis_transform())

zynd9foi

zynd9foi2#

我找到了解决这个问题的另一种方法,即使用pcolormesh,其中颜色数组为1xn:

C = np.reshape(np.array(trnsys_out["LCG_state"][:-1].values), (-1, 1)).T
x = trnsys_out.index
y = [Pmin, Pmax]
ctrl = ax2.pcolormesh(x, y, C, shading="flat", cmap="binary", alpha=0.5, vmin=0, vmax=5)

相关问题