从 fill_ Between() 方法填充已转移

问题描述 投票:0回答:2

我正在尝试使用 Matplotlib

fill_between()
方法填充曲线和 x=0 之间的区域。由于某种原因,阴影似乎向左移动,如图所示。我应该提到,这是我水平绘制的 3 个子图之一。

这是我使用的代码

import matplotlib as mpl
mpl.rcParams['figure.dpi'] = 300

from matplotlib import pyplot as plt

fig, axs = plt.subplots(1, 3)

fig.tight_layout()

ticks_x1 = [-400,1200,4]
major_ticks_x1 = np.linspace(ticks_x1[0],ticks_x1[1],ticks_x1[2]+1)
minor_ticks_x1 = np.linspace(ticks_x1[0],ticks_x1[1],5*ticks_x1[2]+1)

axs[1].plot(V, -z, 'tab:cyan', linewidth=2, solid_capstyle='round')
axs[1].set_title('Querkraft')
axs[1].set(xlabel='V [kN]')
axs[1].set_xticks(major_ticks_x1)
axs[1].set_xticks(minor_ticks_x1,minor=True);
axs[1].fill_between(
        x= V, 
        y1= -z,
        color= "cyan",
        alpha= 0.2)


我该如何解决这个问题?谢谢你。

python matplotlib fill
2个回答
1
投票

我相信这是因为你的函数的开始不为零(我认为在你的情况下这将是 V[0])。

以下是我如何重现您的问题并(某种程度上)修复它(使用简单的函数):

import matplotlib as mpl
import numpy as np
from matplotlib import pyplot as plt
mpl.rcParams['figure.dpi'] = 300
fig, axs = plt.subplots(1, 3)
fig.tight_layout()
ticks_x1 = [-400,1200,4]
major_ticks_x1 = np.linspace(ticks_x1[0],ticks_x1[1],ticks_x1[2]+1)
minor_ticks_x1 = np.linspace(ticks_x1[0],ticks_x1[1],5*ticks_x1[2]+1)
# V[0] will not be zero
z = np.linspace(-3,3, 1000)
V= np.sin(z)
axs[0].plot(V, -z, 'tab:cyan', linewidth=2, solid_capstyle='round')
axs[0].set_title('Querkraft')
axs[0].set(xlabel='V [kN]')
axs[0].set_xticks(major_ticks_x1)
axs[0].set_xticks(minor_ticks_x1,minor=True);
axs[0].grid()
axs[0].fill_between(
        x= V, 
        y1= -z,
        color= "cyan",
        alpha= 0.2)
print(V[0])

好的 - 创建带有“偏移”fill_ Between 的图表(见下文)

现在构造 V 使得 V[0] 为零

z = np.linspace(-np.pi,np.pi, 1000)
V= np.sin(z)

axs[1].plot(V, -z, 'tab:cyan', linewidth=2, solid_capstyle='round')
axs[0].set_title('Querkraft'.format(V.min()))
axs[1].set(xlabel='V [kN]')
axs[1].set_xticks(major_ticks_x1)
axs[1].set_xticks(minor_ticks_x1,minor=True);
axs[1].grid()

axs[1].fill_between(
        x= V, 
        y1= -z,
        color= "cyan",
        alpha= 0.2)

这就是这两张图的样子:

我相信这样做的原因是 fill_ Between 旨在用于水平 fill_ Between ,您可以在两个 y 值之间进行填充 - 通常 x 轴隐式是 fill_ Between 的原点。

当您水平工作时,曲线中的 x 更明显地定义了填充之间的开始和停止位置。当你像这样垂直使用 fill_ Between 时,它就不那么明显了。

这是 fill_ Between 的更典型(水平)用法,这使得曲线的起点和终点定义了填充的开始和停止位置:

当然,现在我只是“某种程度上”解决了你的问题,因为我改变了函数的范围,使 V[0] 为零 - 你可能会被限制这样做。但你至少可以明白为什么 fill_ Between 会像以前那样起作用。


1
投票

好吧,我想我已经找到了解决方案。 Matplotlib 有一个方法

fill_betweenx()

现在代码看起来像这样

import matplotlib as mpl
mpl.rcParams['figure.dpi'] = 300

from matplotlib import pyplot as plt

fig, axs = plt.subplots(1, 3)

fig.tight_layout()

ticks_x1 = [-400,1200,4]
major_ticks_x1 = np.linspace(ticks_x1[0],ticks_x1[1],ticks_x1[2]+1)
minor_ticks_x1 = np.linspace(ticks_x1[0],ticks_x1[1],5*ticks_x1[2]+1)


axs[1].plot(V, -z, 'tab:cyan', linewidth=2, solid_capstyle='round')
axs[1].set_title('Querkraft')
axs[1].set(xlabel='V [kN]')
axs[1].set_xticks(major_ticks_x1)
axs[1].set_xticks(minor_ticks_x1,minor=True);
axs[1].fill_betweenx(
        y= -z, 
        x1= V,
        color= "cyan",
        alpha= 0.2)

并产生所需的结果。我猜它不适用于第一种方法,因为图表是垂直的而不是水平的。

© www.soinside.com 2019 - 2024. All rights reserved.