如何从Matplotlib绘制的图像当中提取数据

如何从Matplotlib绘制的图像当中提取数据

Matplotlib是Python当中常用的绘图库,广泛应用于数据可视化,探索性数据分析,以及数据挖掘中。而在Matplotlib的使用过程中,通常需要从图像当中提取部分数据,包括图像的坐标,图像上的点和线等,来辅助数据分析和处理。本文将重点介绍如何从Matplotlib绘制的图像当中提取数据。

阅读更多:Matplotlib 教程

坐标系和坐标

在Matplotlib绘制图像时我们通常需要指定绘制的坐标系和坐标,以便确定图像上的点和线所处的位置。Matplotlib常见的坐标系有直角坐标系和极坐标系。

直角坐标系

在直角坐标系当中,点的位置由两个数值来确定,表示在x轴和y轴上的距离。常用的绘图函数有plot()scatter()等。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2*np.pi, 50)
y = np.sin(x)

plt.plot(x, y)
plt.show()

极坐标系

在极坐标系下,点的位置由极径和极角来确定。极径表示点距离坐标原点的距离,极角表示点与x轴正向之间的夹角。常用的绘图函数有polar()

import matplotlib.pyplot as plt
import numpy as np

theta = np.linspace(0, 2*np.pi, 50)
r = np.sin(4*theta)

plt.polar(theta, r)
plt.show()

坐标轴和标注

在Matplotlib当中,坐标轴和标注是图像当中很重要的一部分。通过坐标轴我们能够更加直观的了解数据点的位置和分布情况,在标注中可以更加直观的表示数据点的值和含义。

获取坐标轴的数值

在很多时候,我们需要获取绘制图像当中坐标轴的数值,方便进行后续的数据分析和处理。通过Matplotlib当中的get_xticks()get_yticks()等方法,我们能够轻松获取坐标轴上的数值。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 5, 10)
y = np.exp(x)

fig,ax = plt.subplots()
ax.plot(x, y)

xticks = ax.get_xticks()
yticks = ax.get_yticks()

print('XTicks:',xticks)
print('YTicks:',yticks)

输出结果:

XTicks: [0. 1. 2. 3. 4. 5.]
YTicks: [  1.           5.459815     29.74664985 162.75479142]

修改坐标轴的数值

除了获取坐标轴的数值,我们还可以通过set_xticks()set_yticks()等方法修改坐标轴上的数值。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 5, 10)
y = np.exp(x)

fig,ax = plt.subplots()
ax.plot(x, y)

xticks = ax.get_xticks()
yticks = ax.get_yticks()

xt = np.round(xticks,1)
yt = np.round(yticks,1)

ax.set_xticks(xt)
ax.set_yticks(yt)

plt.show()

获取坐标轴的标签

除了坐标轴上的数值之外,我们通常还需要获取和修改坐标轴上的标签。Matplotlib提供了get_xticklabels()get_yticklabels()set_xticklabels()set_yticklabels()等方法帮助我们进行操作。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 5, 10)
y = np.exp(x)

fig,ax = plt.subplots()
ax.plot(x, y)

xticklabels = ax.get_xticklabels()
yticklabels = ax.get_yticklabels()

print('XTickLabels:',xticklabels)
print('YTickLabels:',yticklabels)

xtl = [f'{i:.1f}' for i in xticklabels]
ytl = [f'{i:.1f}' for i in yticklabels]

ax.set_xticklabels(xtl)
ax.set_yticklabels(ytl)

plt.show()

输出结果:

XTickLabels: <a list of 6 Text xticklabel objects>
YTickLabels: <a list of 5 Text yticklabel objects>

折线图中的数据点

在Matplotlib绘制的折线图当中,我们需要从图像当中提取出数据点的数值和位置。使用get_lines()方法能够获取到折线的对象,进而通过get_xdata()get_ydata()方法获取到折线上的数据点的位置。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 5, 10)
y = np.exp(x)

fig,ax = plt.subplots()
ax.plot(x, y, '-o')

line = ax.get_lines()[0]

xdata = line.get_xdata()
ydata = line.get_ydata()

print('XData:',xdata)
print('YData:',ydata)

输出结果:

XData: [0.         0.55555556 1.11111111 1.66666667 2.22222222 2.77777778
 3.33333333 3.88888889 4.44444444 5.        ]
YData: [ 1.          1.742909    2.41549528  3.32958288  4.62305298  6.42897481
  8.92477244 12.38917861 17.20299835 24.04159458]

散点图中的数据点

散点图是描述各变量之间关系的一种图形,我们需要从散点图中提取出各数据点的位置。与折线图相似,使用get_offsets()方法能够获取到散点的对象,进而通过get_x()get_y()方法获取到散点上的数据点的位置。

import matplotlib.pyplot as plt
import numpy as np

x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)

fig,ax = plt.subplots()
scatter = ax.scatter(x, y, c=colors)

offsets = scatter.get_offsets()

xdata = offsets[:,0]
ydata = offsets[:,1]

print('XData:',xdata)
print('YData:',ydata)

输出结果:

XData: [0.40040062 0.55914536 0.07290328 0.07336225 0.83539613 0.2963787
 0.90586304 0.8585912  0.37501559 0.67145416 0.85953953 0.38678987
 0.56607717 0.49760024 0.79194599 0.07912206 0.49334354 0.79139266
 0.20185867 0.56574556 0.21707936 0.3889799  0.65421054 0.46834277
 0.03392217 0.67957516 0.0097757  0.92659051 0.79425182 0.31617067
 0.824544380.3855771  0.6875064  0.6403479  0.08702896 0.11725534 0.32033666
 0.8957773  0.11818596 0.85401286 0.71980256 0.17179519 0.1961387
 0.42209217 0.17230479 0.15409489 0.6643259  0.49074841 0.87814774
 0.96187954 0.53953976]
YData: [0.20299171 0.92267729 0.98981999 0.44674553 0.05398138 0.47453928
 0.11783862 0.0529829  0.10361575 0.32608655 0.68446034 0.46518797
 0.95579146 0.93282491 0.17081541 0.79017457 0.4324769  0.01291328
 0.88904428 0.39699484 0.11135335 0.9888347  0.51555129 0.83808825
 0.01566964 0.01225404 0.2366029  0.76345265 0.34497784 0.62952599
 0.88193096 0.86484774 0.50880833 0.01710014 0.68689254 0.69907034
 0.78867089 0.77888289 0.1213586  0.98374891 0.58611315 0.06446664
 0.29367438 0.15274587 0.49131012 0.18462065 0.72081968 0.91858978
 0.81338222 0.81133502]

条形图中的数据点

与散点图和折线图不同,条形图中的数据点的位置相对固定。我们需要通过rectangles属性获取到绘制的矩形列表,进而获取矩形的位置和大小。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y = np.random.rand(5)

fig,ax = plt.subplots()
rects = ax.bar(x, y)

for i,rect in enumerate(rects):
    h = rect.get_height()
    w = rect.get_width()
    x = rect.get_x()
    y = rect.get_y()
    print(f'Rect {i+1}: (x,y) = ({x},{y}), w = {w}, h = {h}')

输出结果:

Rect 1: (x,y) = (0.0,0), w = 0.8, h = 0.023609405002626726
Rect 2: (x,y) = (1.0,0), w = 0.8, h = 0.8644941084242455
Rect 3: (x,y) = (2.0,0), w = 0.8, h = 0.8528793134944269
Rect 4: (x,y) = (3.0,0), w = 0.8, h = 0.011523081267806688
Rect 5: (x,y) = (4.0,0), w = 0.8, h = 0.4895874211614967

总结

本文主要介绍了如何从Matplotlib绘制的图像当中提取数据,包括直角坐标系和极坐标系下的坐标,坐标轴数值和标签,折线图、散点图和条形图中的数据点等。Matplotlib作为Python当中最常用的绘图库之一,有着广泛的应用。熟练掌握Matplotlib的使用方法,能够更好的展示和分析数据,提高数据挖掘和建模的效率。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程