【问题标题】:Plotting a curve with different background colors in python在python中绘制具有不同背景颜色的曲线
【发布时间】:2015-09-20 02:53:24
【问题描述】:

我试图在读取数据文件后绘制曲线。曲线上方和曲线下方的背景应该不同(例如,红色和绿色)。这就像一个相图,显示了边界线上方和下方的两个不同相。是否可以在 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

所以它应该绘制一条抛物线。

here 可能存在重复。但是,这在我的情况下似乎不起作用。

我还想在不同颜色的补丁中间输入文本。

所以我的情节应该是这样的:

【问题讨论】:

标签: python matplotlib plot


【解决方案1】:

是的,这可以使用 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 的文本添加文本。 您需要指定坐标,但您可以执行类似

的操作
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 plt.ylim() 返回一个列表,其中 y 轴上的最小值和 y 轴上的最大值。 maxy = plt.ylim()[1] 简单地提取列表的第二个值,它是图上当前的最大 y 值(在本例中为 90)。这样一来,您就无需猜测应该填写的最高 y 值是多少。
  • @progmman 那么maxy = plt.ylim()[1] 不是只适用于单调递增函数吗?
  • @hbaromenga 不。我措辞错误。plt.ylim() 返回 y 轴的当前边界,而不是绘制的函数。这意味着它可以独立于绘图上的功能使用。
  • 非常感谢。这意味着最大限制或范围。那么它是有道理的。
【解决方案2】:

我对您的代码进行了一些更正。下面的代码工作正常(使用相同的“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()

输出:

【讨论】:

  • 非常感谢。您在这里使用了两个子图。但是,如果我使用color 而不是facecolor,代码仍然有效,尽管红色和绿色之间的边界线没有那么粗。你能解释一下为什么吗?
猜你喜欢
  • 1970-01-01
  • 2020-04-21
  • 2020-06-09
  • 2022-10-01
  • 2011-10-01
  • 2021-06-18
  • 1970-01-01
相关资源
最近更新 更多