使用Python绘制带有不同背景颜色的曲线

3

我正在尝试在读取数据文件后绘制曲线。曲线上方和下方的背景应该不同(比如红色和绿色)。这就像一个相图,显示一个分界线以上和以下的两个不同相。在Python中使用matplotlib是否可能?我的代码如下:

#!/usr/bin/env python

import numpy as np
import pylab as pl
import matplotlib.pyplot as plt

# Use numpy to load the data contained in the file
# 'data.txt' into a 2-D array called data
data = np.loadtxt('data.txt')
# plot the first column as x, and second column as y
x=data[:,0]
y=data[:,1]
pl.plot(x,y, '-r')
pl.xlabel('x')
pl.ylabel('y')
pl.show()

'data.txt'文件包含:

0 0
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81

因此,它应该绘制一个抛物线。
这里有可能重复的问题。但是,在我的情况下似乎不起作用。
另外,我想在不同颜色的补丁中间输入文本。
因此,我的绘图应该如下所示:
enter image description here

可能是Filling above/below matplotlib line plot的重复问题。 - user
2个回答

3

是的,使用matplotlib的fill_between方法可以实现。你可以简单地使用plt.fill_between(x,y,color="whatever")来填充线条下方的区域。为了更完整,你还可以使用plt.fill_between(x,0,y,color="whatever")来设置填充区域的下限。

要填充曲线上面的整个区域,你可以使用plt.fill_between(x,y,plt.ylim()[1],color="whatever")

以下是一些演示代码,它们可以同时用于填充曲线上下两侧的区域:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,9,10)
y = x ** 2
plt.plot(x,y,"b-")
plt.fill_between(x,y,color="red")
maxy = plt.ylim()[1]
plt.fill_between(x,y,maxy,color="green")
plt.show()

你可以任意设置x和y的值。

希望这能帮到你!

编辑:你可以使用matplotlib的text方法添加文本。你需要指定坐标,但你可以像下面这样操作:

xtextplace = x[7]
ytextplace = y[7] / 2
plt.text(xtextplace,ytextplace,"Some Text")

我会这样做:

我会这样做:

xcoord = x[int((x.size/3)*2)]
ycoord = y[int((x.size/3)*2)] / 2
plt.text(xcoord,ycoord,"Text")

这将使文本出现在x轴的2/3处,并且在该点下方曲线的1/2位置。


非常感谢。我稍微更新了我的问题。如果我交换颜色,即 plt.fill_between(x,y,color="green")plt.fill_between(x,y,maxy,color="red"),那么我就得到了我想要的结果。但是,maxy = plt.ylim( )[1] 意味着什么? - hbaromega
@hbaromega plt.ylim() 返回一个列表,其中包含y轴上的最小值和最大值。maxy = plt.ylim()[1] 只是简单地提取了列表的第二个值,即当前图形中的最大y值(在本例中为90)。这样,您就不需要猜测应该填充到哪个最高的y值。 - pogrmman
@progmman 那么 maxy = plt.ylim()[1] 不是只适用于单调递增的函数吗? - hbaromega
@hbaromenga 不是的。我的措辞不太准确。plt.ylim()返回y轴当前的范围,而不是绘制的函数。这意味着它可以独立于图表上的函数使用。 - pogrmman
非常感谢。这意味着最大限制或范围。那么就有意义了。 - hbaromega

0

我对你的代码进行了一些更正。下面的代码可以正常工作(使用相同的"data.txt"文件)

Python3版本:

#!/usr/bin/python

import numpy as np
import matplotlib.pyplot as plt

data = np.loadtxt('data.txt')
x=data[:,0]
y=data[:,1]
(ax1, ax2) = plt.subplots(sharex=True, sharey=True)
ax2.fill_between(x, y, facecolor='green')
ax2.fill_between(x, y, plt.ylim()[1], facecolor='red')
plt.show()

输出:

enter image description here


非常感谢。您在此处使用了两个子图。但是,如果我使用color而不是facecolor,代码仍然有效,尽管红色和绿色之间的边界线不那么粗。您能解释一下原因吗? - hbaromega

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接