首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从fill_between()方法移位的Python填充

从fill_between()方法移位的Python填充
EN

Stack Overflow用户
提问于 2022-09-28 13:43:55
回答 2查看 49关注 0票数 0

我试图用Matplotlib fill_between()方法填充曲线和fill_between()之间的区域。由于某些原因,阴影似乎被移动到左边,从图片中可以看到。我要指出的是,这是我在水平上相邻的三个子情节之一。

这是我使用的代码

代码语言:javascript
运行
复制
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)

我怎么才能解决这个问题?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2022-09-28 18:55:45

我相信这是因为函数的开头不是零(我认为在你的情况下是V)。

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

代码语言:javascript
运行
复制
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为零。

代码语言:javascript
运行
复制
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的行为是这样的。

票数 1
EN

Stack Overflow用户

发布于 2022-09-29 07:48:34

好吧,我想我找到了解决办法。Matplotlib有一个方法fill_betweenx()

现在代码如下所示

代码语言:javascript
运行
复制
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方法,因为图形是垂直的,而不是水平的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73882525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档