Matplotlib - 艺术家



理解 Matplotlib 中的艺术家

在 Matplotlib 中,你几乎在绘图上看到的任何东西都是艺术家的一个实例,它们是表示绘图各个组件的对象。无论是表示数据的线,文本标签,甚至是轴上的刻度标记,Matplotlib 绘图中的所有内容都是一个艺术家对象。

在探索艺术家层次结构之前,让我们观察下面的图像以了解 matplotlib 中图形的基本组件:

Artists Into image

在图中,每个元素,例如表示数据的线和点,以及与文本标签相关的次要刻度和点,都可以识别为单独的艺术家对象。

艺术家层次结构

在 matplotlib 的层次结构中,艺术家可以大致分为两种类型:

  • 基本艺术家 - 这些是绘图的基本构建块。示例包括Line2DRectangleTextAxesImage等等。这些是我们想要绘制到画布上的标准图形对象。
  • 复合艺术家 - 这些是包含其他艺术家的更高级别结构。示例包括FigureAxisAxes。Figure 就像一个包含所有内容的画布,而 Axes 表示图形内的特定绘图。

创建和访问艺术家

艺术家通常是通过 Axes 对象上的绘图方法创建的。这些方法不仅促进了可视元素的创建,还返回与已绘制元素对应的特定艺术家实例。

以下是一些常见的绘图方法以及它们生成的相应艺术家:

  • annotate - 为文本注释生成Annotation艺术家。
  • bar - 为条形图创建Rectangle艺术家。
  • errorbar - 为误差条形图生成Line2DRectangle艺术家。
  • fill - 为共享区域生成Polygon艺术家。
  • hist - 为直方图创建Rectangle艺术家。
  • imshow - 为图像数据生成AxesImage艺术家。
  • legend - 为 Axes 图例生成Legend艺术家。
  • plot - 为 XY 图创建Line2D艺术家。绘制多个数据集时返回列表。
  • scatter - 为散点图生成PolyCollection艺术家。
  • text - 生成Text艺术家以在绘图上显示文本。

示例

让我们来看一个使用plot()方法创建和访问艺术家的示例。

import matplotlib.pyplot as plt
import matplotlib.artist as martist
import numpy as np

# Create a subplot
fig, ax = plt.subplots()

# Generate random data
x, y = np.random.rand(2, 100)

# Use the plot method to create a Line2D artist
lines = ax.plot(x, y, '-', label='example')

# Accessing the Line2D artists created by the plot method
print('Line2D artists created by the plot method:', lines)

# Retrieve all Line2D artists associated with the Axes
lines_on_axes = ax.get_lines()

# Display the retrieved Line2D artists
print('Line2D artists obtained using get_lines():', lines_on_axes)

# Accessing the first (and in this case, the only) Line2D artist
print('Accessing the first Line2D artist', ax.get_lines()[0])

输出

执行上述代码后,我们将得到以下输出:

Line2D artists created by the plot method: [<matplotlib.lines.Line2D object at 0x000001DB3666A620>]
Line2D artists obtained using get_lines(): 
Accessing the first Line2D artist Line2D(example)

修改艺术家属性

艺术家具有各种定义其外观和行为的属性。这些属性包括颜色、线型、线宽和标记。修改这些属性使我们能够控制绘图的视觉方面。

示例

以下示例演示如何创建简单的绘图,然后修改关联的 Line2D 艺术家的属性。

import matplotlib.pyplot as plt
import numpy as np

# Creating a simple plot
fig, ax = plt.subplots(figsize=(7, 4))
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)

# Use the plot method to create a Line2D artist
lines = ax.plot(x, y)

# Displaying initial properties of the Line2D artist
print('Initial properties of the Line2D artist:')
print('Color:', ax.get_lines()[0].get_color())
print('Line Style:', ax.get_lines()[0].get_linestyle())
print('Marker Size:', ax.get_lines()[0].get_markersize())

# Modifying properties 
lines[0].set(color='green', linewidth=2)
lines[0].set_linestyle(':')         
lines[0].set_marker('s')            
lines[0].set_markersize(10)

# Accessing the modified properties of the Line2D artist
print('\nModified properties of the Line2D artist:')
print('Color:', ax.get_lines()[0].get_color())
print('Line Style:', ax.get_lines()[0].get_linestyle())
print('Marker Size:', ax.get_lines()[0].get_markersize())

输出

执行上述代码后,我们将得到以下输出:

Initial properties of the Line2D artist:
Color: #1f77b4
Line Style: -
Marker Size: 6.0

Modified properties of the Line2D artist:
Color: green
Line Style: :
Marker Size: 10.0

操作艺术家数据

除了样式属性之外,艺术家还可以包含数据。例如,Line2D 对象具有可以使用set_data()方法修改的数据属性。

示例

这是一个操作艺术家数据的示例。

import matplotlib.pyplot as plt
import numpy as np

# Creating a simple plot 
fig, ax = plt.subplots(figsize=(7, 4))
x = np.linspace(0, 2 * np.pi, 100)

# Initial sinusoidal curve
y = np.sin(x)

# Use the plot method to create a Line2D artist a sinusoidal curve
lines = ax.plot(x, y)

# Modifying the artist data with the cosine 
lines[0].set_data([x, np.cos(x)])         

# Displaying the plot
plt.show()

输出

执行上述代码后,我们将得到以下输出:

Artists Example 1

手动添加艺术家

虽然许多艺术家都有辅助方法,但在某些情况下需要手动添加。例如,可以通过使用add_artist()方法将圆形或矩形等补丁直接添加到 Axes 对象。

示例

在这个例子中,我们手动将圆形补丁添加到轴。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as mpatches

# Creating a simple plot 
fig, ax = plt.subplots(figsize=(7, 4))
x = np.linspace(0, 2 * np.pi, 100)

# Initial sinusoidal curve
y = np.sin(x)

# Use the plot method to create a Line2D artist for a sinusoidal curve
lines = ax.plot(x, y)

# Adding a circle 
circle = mpatches.Circle((3, 0), 0.25, ec="none")
ax.add_artist(circle)

# Adding another clipped circle 
clipped_circle = mpatches.Circle((3, 1), 0.125, ec="none", facecolor='C1')
ax.add_artist(clipped_circle)
ax.set_aspect(1)

# Adding a title to the plot
plt.title('Manual Addition of Artists')

# Displaying the plot
plt.show()

输出

执行上述代码后,我们将得到以下输出:

Artists Example 2

移除艺术家

Matplotlib 提供了一种灵活的方法来从绘图中移除特定的艺术家。艺术家的remove()方法允许从其 Axes 列表中移除艺术家。

示例

这是一个演示如何从绘图中移除特定艺术家(Line2D 和文本)的示例。

import numpy as np
import matplotlib.pyplot as plt

# Create the figure
fig, ax = plt.subplots(figsize=(7, 4))
x = np.linspace(-10, 10, 100)
y = np.sin(x)

# plot the scatter plot 
scat = ax.scatter(x, y)

# Assign the another Line2D artist to line_2
line_2 = plt.plot(x, np.cos(x), linestyle='dashed')  

plt.margins(0.2)
plt.title("After removing the text and line artist")

text = fig.text(0.5, 0.96, "$y=sin(x)$")

# Remove the line_2 artist
l = line_2.pop(0)
l.remove()

# Remove the text artist
text.remove()

# Displaying the plot
plt.show()

输出

执行上述代码后,你将得到以下输出:

Artists Example 3
广告