matplotlib 从fill_between()方法填充偏移

rkue9o1l  于 2023-10-24  发布在  其他
关注(0)|答案(2)|浏览(119)

我试图用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)

我该怎么弥补?谢谢。

shyt4zoc

shyt4zoc1#

我相信这是因为你的函数的开始不是零(我认为在你的情况下是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])

好的-这将创建带有“offset”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)

这就是这两个图的样子:x1c 0d1x
我相信这是因为fill_between是用于水平fill_between的,在这里你在两个y值之间填充-通常x轴隐含地是fill_between的原点。
当你水平工作时,曲线中的x更明显地定义了fill_between应该在哪里开始和停止。当你像这样垂直使用fill_between时,它就不那么明显了。
下面是fill_between的一个更典型的(水平)用法,它可以更清楚地表明曲线的开始和结束定义了填充的开始和停止位置:

当然,我只是“某种程度上”解决了你的问题,因为我改变了函数的范围,使V[0]为零--你可能会被限制这样做。但你至少可以看到为什么fill_between会这样做。

pgx2nnw8

pgx2nnw82#

好了,我想我找到了一个解决方案。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)

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

相关问题