Matplotlib.pyplot.fill() 函数:轻松创建填充区域图
参考:Matplotlib.pyplot.fill() function in Python
Matplotlib是Python中最流行的数据可视化库之一,而pyplot模块是其中最常用的接口。在这个模块中,fill()
函数是一个强大而灵活的工具,用于创建填充区域图。本文将深入探讨pyplot.fill()
函数的用法、参数和各种应用场景,帮助你掌握这个实用的绘图技巧。
1. 基本概念和语法
pyplot.fill()
函数的主要作用是在二维平面上创建填充多边形。它可以接受一系列x坐标和y坐标,然后将这些点连接起来形成一个封闭的区域,并用指定的颜色填充。
基本语法如下:
matplotlib.pyplot.fill(*args, data=None, **kwargs)
其中:
– *args
:可以是x和y坐标的序列,也可以是点的坐标对。
– data
:可选参数,用于指定包含绘图数据的对象。
– **kwargs
:其他关键字参数,用于设置填充区域的属性。
让我们从一个简单的例子开始:
import matplotlib.pyplot as plt
import numpy as np
x = np.array([0, 1, 2, 1])
y = np.array([0, 1, 0, 0])
plt.fill(x, y, 'r', alpha=0.5)
plt.title('Simple Fill Example - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个例子中,我们创建了一个简单的三角形填充区域。'r'
参数指定了填充颜色为红色,alpha=0.5
设置了透明度为50%。
2. 颜色和透明度设置
fill()
函数提供了多种方式来设置填充区域的颜色和透明度。
2.1 使用颜色名称
你可以直接使用颜色的名称作为参数:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 100)
y1 = np.sin(x)
y2 = np.sin(2*x)
plt.fill(x, y1, 'blue', x, y2, 'red', alpha=0.3)
plt.title('Fill with Color Names - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
这个例子展示了如何使用颜色名称(’blue’和’red’)来填充两个不同的区域。
2.2 使用RGB或RGBA值
你也可以使用RGB或RGBA值来精确控制颜色:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
plt.fill(x, y, color=(0.1, 0.2, 0.5, 0.3))
plt.title('Fill with RGBA Values - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个例子中,我们使用RGBA值(0.1, 0.2, 0.5, 0.3)来设置填充颜色和透明度。
3. 多区域填充
fill()
函数允许你在一次调用中填充多个区域。这在比较不同数据集或展示数据范围时特别有用。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 100)
y1 = np.sin(x)
y2 = np.sin(2*x)
y3 = np.sin(3*x)
plt.fill(x, y1, 'r', x, y2, 'g', x, y3, 'b', alpha=0.3)
plt.title('Multiple Region Fill - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
这个例子展示了如何在一个图表中填充三个不同的正弦波区域,每个区域使用不同的颜色。
4. 填充between函数
虽然不是fill()
函数的直接部分,但fill_between()
函数是一个相关的非常有用的工具,特别是在绘制数据范围或误差区间时。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 100)
y1 = np.sin(x)
y2 = np.sin(2*x)
plt.fill_between(x, y1, y2, where=(y1>y2), color='red', alpha=0.3, interpolate=True)
plt.fill_between(x, y1, y2, where=(y1<=y2), color='blue', alpha=0.3, interpolate=True)
plt.title('Fill Between Example - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
这个例子展示了如何使用fill_between()
函数来填充两条曲线之间的区域,并根据条件使用不同的颜色。
5. 堆叠区域图
fill()
函数还可以用来创建堆叠区域图,这在展示累积数据或比例数据时非常有用。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
plt.fill(x, y1, 'r', alpha=0.3, label='Sin')
plt.fill(x, y1+y2, 'g', alpha=0.3, label='Sin+Cos')
plt.fill(x, y1+y2+y3, 'b', alpha=0.3, label='Sin+Cos+Tan')
plt.title('Stacked Area Plot - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.show()
Output:
这个例子创建了一个堆叠区域图,展示了三个三角函数的累积效果。
6. 自定义边界线
默认情况下,fill()
函数会在填充区域的边界绘制一条线。你可以自定义这条线的属性,或者完全移除它。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
plt.fill(x, y, color='lightblue', edgecolor='darkblue', linewidth=2)
plt.title('Custom Edge Line - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个例子中,我们设置了填充颜色为浅蓝色,边界线颜色为深蓝色,并增加了线宽。
7. 填充不规则形状
fill()
函数不仅限于规则的形状,它可以用来填充任何由点定义的封闭区域。
import matplotlib.pyplot as plt
import numpy as np
theta = np.linspace(0, 2*np.pi, 100)
r = 1 + 0.5 * np.sin(5*theta)
x = r * np.cos(theta)
y = r * np.sin(theta)
plt.fill(x, y, 'g', alpha=0.3)
plt.title('Irregular Shape Fill - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.axis('equal')
plt.show()
Output:
这个例子创建了一个不规则的星形区域并填充。
8. 结合其他绘图元素
fill()
函数可以与其他Matplotlib绘图函数结合使用,创建更复杂的可视化效果。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
plt.fill(x, y, 'lightblue', alpha=0.3)
plt.plot(x, y, 'b-', linewidth=2)
plt.scatter(x[::10], y[::10], color='red', s=50)
plt.title('Combined Plot Elements - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
这个例子结合了填充区域、线图和散点图,展示了如何创建更丰富的数据可视化。
9. 使用填充创建直方图
虽然Matplotlib有专门的直方图函数,但你也可以使用fill()
函数来创建自定义的直方图效果。
import matplotlib.pyplot as plt
import numpy as np
data = np.random.normal(0, 1, 1000)
counts, bins = np.histogram(data, bins=30)
plt.fill(bins[:-1], counts, step='post', alpha=0.3)
plt.title('Histogram using Fill - how2matplotlib.com')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()
这个例子展示了如何使用fill()
函数创建一个类似直方图的效果。
10. 填充对数刻度图
fill()
函数也可以在对数刻度的图表中使用,这在处理跨越多个数量级的数据时特别有用。
import matplotlib.pyplot as plt
import numpy as np
x = np.logspace(0, 3, 100)
y1 = np.log10(x)
y2 = np.log10(x) + 0.5
plt.fill_between(x, y1, y2, alpha=0.3)
plt.xscale('log')
plt.title('Fill on Log Scale - how2matplotlib.com')
plt.xlabel('X-axis (log scale)')
plt.ylabel('Y-axis')
plt.show()
Output:
这个例子展示了如何在对数刻度的x轴上使用填充效果。
11. 动态填充
你可以结合动画效果来创建动态填充图,这在展示时间序列数据或数据变化时特别有效。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots()
x = np.linspace(0, 2*np.pi, 100)
line, = ax.plot(x, np.sin(x))
fill = ax.fill_between(x, np.sin(x), alpha=0.3)
def update(frame):
y = np.sin(x + frame/10)
line.set_ydata(y)
ax.collections.clear()
ax.fill_between(x, y, alpha=0.3)
return line, fill
ani = FuncAnimation(fig, update, frames=100, interval=50, blit=True)
plt.title('Dynamic Fill Animation - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
这个例子创建了一个动态填充的正弦波动画。
12. 填充极坐标图
fill()
函数也可以用于极坐标系统,创建扇形或其他极坐标形状。
import matplotlib.pyplot as plt
import numpy as np
theta = np.linspace(0, 2*np.pi, 100)
r = 0.5 + np.cos(theta)
ax = plt.subplot(111, projection='polar')
ax.fill(theta, r, 'g', alpha=0.3)
ax.set_title('Polar Fill - how2matplotlib.com')
plt.show()
Output:
这个例子在极坐标系统中创建了一个填充的心形图案。
13. 使用渐变填充
虽然fill()
函数本身不直接支持渐变填充,但你可以通过创建多个略微重叠的填充区域来模拟渐变效果。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
for i in range(100):
alpha = (i + 1) / 100
plt.fill_between(x, 0, y, alpha=0.01, color=(1-alpha, 0, alpha))
plt.title('Gradient Fill Effect - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
这个例子通过多次调用fill_between()
函数,每次略微改变颜色和透明度,创造出一种渐变填充的效果。
14. 填充与剪裁
你可以结合使用fill()
函数和Matplotlib的剪裁功能来创建更复杂的填充效果。
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
circle = plt.Circle((0.5, 0.5), 0.4, transform=ax.transAxes, fill=False)
ax.add_patch(circle)
x = np.linspace(0, 1, 100)
y = np.sin(2*np.pi*x)
ax.fill(x, y, 'r', alpha=0.3, clip_path=circle, clip_on=True)
ax.set_title('Clipped Fill - how2matplotlib.com')
plt.show()
Output:
这个例子展示了如何使用圆形剪裁路径来限制填充区域。
15. 交互式填充
结合Matplotlib的交互式功能,你可以创建允许用户动态调整填充区域的图表。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import Slider
fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.25)
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
line, = plt.plot(x, y)
fill = plt.fill_between(x,0, y, alpha=0.3)
ax_slider = plt.axes([0.1, 0.1, 0.8, 0.03])
slider = Slider(ax_slider, 'Amplitude', 0, 2, valinit=1)
def update(val):
amp = slider.val
line.set_ydata(amp * np.sin(x))
ax.collections.clear()
ax.fill_between(x, 0, amp * np.sin(x), alpha=0.3)
fig.canvas.draw_idle()
slider.on_changed(update)
plt.title('Interactive Fill - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
这个例子创建了一个交互式图表,用户可以通过滑块来调整正弦波的振幅,填充区域会相应地更新。
16. 填充与文本结合
你可以在填充区域上添加文本,以提供额外的信息或标签。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
plt.fill(x, y, 'lightblue', alpha=0.3)
plt.text(np.pi, 0.5, 'Sine Wave', fontsize=12, ha='center', va='center')
plt.title('Fill with Text - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
这个例子在填充的正弦波区域中心添加了一个文本标签。
17. 多子图中的填充
在复杂的多子图布局中,你可以在不同的子图中使用fill()
函数来创建丰富的可视化效果。
import matplotlib.pyplot as plt
import numpy as np
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
x = np.linspace(0, 2*np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
ax1.fill(x, y1, 'r', alpha=0.3)
ax1.set_title('Sine Wave - how2matplotlib.com')
ax2.fill(x, y2, 'b', alpha=0.3)
ax2.set_title('Cosine Wave - how2matplotlib.com')
plt.tight_layout()
plt.show()
Output:
这个例子在两个并排的子图中分别填充了正弦波和余弦波。
18. 使用填充创建热图效果
虽然Matplotlib有专门的热图函数,但你也可以使用fill()
函数来创建类似热图的效果。
import matplotlib.pyplot as plt
import numpy as np
data = np.random.rand(10, 10)
x, y = np.meshgrid(np.arange(11), np.arange(11))
for i in range(10):
for j in range(10):
color = plt.cm.viridis(data[i, j])
plt.fill([x[i,j], x[i,j+1], x[i+1,j+1], x[i+1,j]],
[y[i,j], y[i,j+1], y[i+1,j+1], y[i+1,j]],
color=color)
plt.title('Heatmap-like Effect with Fill - how2matplotlib.com')
plt.colorbar(plt.cm.ScalarMappable(cmap='viridis'))
plt.show()
这个例子使用fill()
函数创建了一个类似热图的效果,每个单元格的颜色对应于随机生成的数据值。
结论
matplotlib.pyplot.fill()
函数是一个强大而灵活的工具,可以用于创建各种填充效果的图表。从简单的区域填充到复杂的数据可视化,它都能胜任。通过调整颜色、透明度、边界线等参数,你可以创建出既美观又信息丰富的图表。
本文详细介绍了fill()
函数的基本用法、参数设置,以及在各种场景下的应用。我们探讨了如何创建单色填充、多区域填充、堆叠区域图,以及如何将填充与其他绘图元素结合。我们还介绍了一些高级技巧,如在对数刻度上使用填充、创建动态填充动画、在极坐标系中使用填充等。
通过这些示例,你应该能够掌握fill()
函数的各种用法,并能够根据自己的需求创建出独特而有效的数据可视化。记住,实践是掌握这些技能的关键。尝试修改这些示例,创建你自己的图表,探索fill()
函数的更多可能性。
最后,虽然fill()
函数非常有用,但它只是Matplotlib强大功能的一小部分。结合其他绘图函数和技巧,你可以创建出更加复杂和专业的数据可视化。继续学习和探索Matplotlib的其他功能,将帮助你成为数据可视化领域的专家。