我试图用Matplotlib fill_between()
方法填充曲线和fill_between()
之间的区域。由于某些原因,阴影似乎被移动到左边,从图片中可以看到。我要指出的是,这是我在水平上相邻的三个子情节之一。
这是我使用的代码
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)
我怎么才能解决这个问题?谢谢。
发布于 2022-09-28 18:55:45
我相信这是因为函数的开头不是零(我认为在你的情况下是V)。
下面是我如何重现您的问题并(某种程度上)修复它(使用一个简单的函数):
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为零。
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值为零--你可能会被限制不这么做。但你至少可以看到为什么fill_between的行为是这样的。
发布于 2022-09-29 07:48:34
好吧,我想我找到了解决办法。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方法,因为图形是垂直的,而不是水平的。
https://stackoverflow.com/questions/73882525
复制相似问题