我正在尝试使用 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)
我该如何解决这个问题?谢谢你。
我相信这是因为你的函数的开始不为零(我认为在你的情况下这将是 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 会像以前那样起作用。
好吧,我想我已经找到了解决方案。 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)
并产生所需的结果。我猜它不适用于第一种方法,因为图表是垂直的而不是水平的。