如何在 Python 上制作简单高效的绘图
how to make easy and efficient plots on Python
我使用 matplotlib 来绘图,我觉得它很棒,但有时太复杂了。举个例子:
import matplotlib.pyplot as plt
import numpy as np
idx1 = -3
idx2 = 3
x = np.arange(-3, 3, 0.01)
y = np.sin(np.pi*x*7)/(np.pi*x*7)
major_ticks = np.arange(idx1, idx2, 1)
minor_ticks = np.arange(idx1, idx2, 0.1)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_ylim(-0.3, 1.2)
ax.set_xlim(idx1, idx2)
ax.set_xticks(major_ticks)
ax.set_xticks(minor_ticks, minor = True)
ax.grid(True, which = 'both')
ax.tick_params(axis = 'x', labelsize = 18)
ax.tick_params(axis = 'y', labelsize = 18)
ax.plot(x, y)
plt.show()
有没有在 matplotlib and/or seaborn 上实现的任何东西,我可以在其中提供所有这些绘图设置,就像函数的参数一样?它可能会大大减少代码行数并使脚本更易于编写和理解。
Matplotlib 提供了面向对象API。这意味着图中的所有元素实际上都是可以获取和设置属性并且可以轻松操作的对象。这使得 matplotlib 非常灵活,几乎可以生成您想象的任何情节。
由于绘图可能包含一百个或更多元素,因此允许具有相同灵活性的函数将需要那么多可能的参数。记住函数所有可能的参数不一定比 class 的所有可能属性更容易。
用一个函数调用完成所有这些并不一定意味着您必须输入更少的字符。命令的顺序会有所不同。
此外,面向对象的方法允许将事物分开。坐标轴的某些属性(如网格或坐标轴标签)完全独立于您绘制到坐标区的内容。所以你不想在对 plot
的调用中设置 xticks,因为它们根本不相关,并且在同一轴上绘制两条线时设置两次相同的刻度标签可能会非常混乱。
另一方面,matplotlib 真的很容易。为了产生一个情节,你需要两条线
import matplotlib.pyplot as plt
plt.plot([1,2,3],[2,1,3])
它完全按照需要设置了大部分参数。您越想自定义此图,您必须应用的设置就越多。这很好,因为它允许用户自己确定他想要控制情节外观的深度。
大多数 matplotlib 代码可以分为三个部分。
- 设置样式
- 创建情节
- 自定义剧情
设置样式 在问题代码的情况下涉及例如刻度标签大小和网格的使用。这些属性可以像在代码中完成的那样设置,但可能确实有人总是想在这里使用相同的属性,并且发现在每次创建绘图时键入相同的参数很烦人。因此 matplotlib 提供了通用的样式设置,称为 rcParams。它们可以设置在脚本的开头,例如
plt.rcParams['lines.linewidth'] = 2
plt.rcParams['axes.grid '] = True
plt.rcParams['axes.labelsize'] = 18
并将应用于脚本中的所有地块。也可以使用这些参数定义完整的样式表。有关详细信息,请参阅 Customizing matplotlib article.
对于某些应用程序,同样可以使用 predefined stylesheets。
简单地导入 import seaborn
也是改变样式的一种可能方法。
创建情节再简单不过了。很明显,需要与要绘制的项目一样多的绘图命令。创建像
这样的图形和坐标轴
fig, ax = plt.subplots()
虽然节省了一行。
同样,如果需要自定义 刻度或刻度标记,则无法进行任何简化。然而,人们可能会考虑为此目的使用 Tickers and Formatters。
最后当然可以考虑编写一个自定义函数来执行其中大部分任务,但每个人都可以决定这是否对自己有用。
四处浏览我看到了这个wabe page。
这行代码可以概括很多设置
import matplotlib as mpl
mpl.rc('lines', linewidth=2, color='r')
我使用 matplotlib 来绘图,我觉得它很棒,但有时太复杂了。举个例子:
import matplotlib.pyplot as plt
import numpy as np
idx1 = -3
idx2 = 3
x = np.arange(-3, 3, 0.01)
y = np.sin(np.pi*x*7)/(np.pi*x*7)
major_ticks = np.arange(idx1, idx2, 1)
minor_ticks = np.arange(idx1, idx2, 0.1)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_ylim(-0.3, 1.2)
ax.set_xlim(idx1, idx2)
ax.set_xticks(major_ticks)
ax.set_xticks(minor_ticks, minor = True)
ax.grid(True, which = 'both')
ax.tick_params(axis = 'x', labelsize = 18)
ax.tick_params(axis = 'y', labelsize = 18)
ax.plot(x, y)
plt.show()
有没有在 matplotlib and/or seaborn 上实现的任何东西,我可以在其中提供所有这些绘图设置,就像函数的参数一样?它可能会大大减少代码行数并使脚本更易于编写和理解。
Matplotlib 提供了面向对象API。这意味着图中的所有元素实际上都是可以获取和设置属性并且可以轻松操作的对象。这使得 matplotlib 非常灵活,几乎可以生成您想象的任何情节。
由于绘图可能包含一百个或更多元素,因此允许具有相同灵活性的函数将需要那么多可能的参数。记住函数所有可能的参数不一定比 class 的所有可能属性更容易。
用一个函数调用完成所有这些并不一定意味着您必须输入更少的字符。命令的顺序会有所不同。
此外,面向对象的方法允许将事物分开。坐标轴的某些属性(如网格或坐标轴标签)完全独立于您绘制到坐标区的内容。所以你不想在对 plot
的调用中设置 xticks,因为它们根本不相关,并且在同一轴上绘制两条线时设置两次相同的刻度标签可能会非常混乱。
另一方面,matplotlib 真的很容易。为了产生一个情节,你需要两条线
import matplotlib.pyplot as plt
plt.plot([1,2,3],[2,1,3])
它完全按照需要设置了大部分参数。您越想自定义此图,您必须应用的设置就越多。这很好,因为它允许用户自己确定他想要控制情节外观的深度。
大多数 matplotlib 代码可以分为三个部分。
- 设置样式
- 创建情节
- 自定义剧情
设置样式 在问题代码的情况下涉及例如刻度标签大小和网格的使用。这些属性可以像在代码中完成的那样设置,但可能确实有人总是想在这里使用相同的属性,并且发现在每次创建绘图时键入相同的参数很烦人。因此 matplotlib 提供了通用的样式设置,称为 rcParams。它们可以设置在脚本的开头,例如
plt.rcParams['lines.linewidth'] = 2
plt.rcParams['axes.grid '] = True
plt.rcParams['axes.labelsize'] = 18
并将应用于脚本中的所有地块。也可以使用这些参数定义完整的样式表。有关详细信息,请参阅 Customizing matplotlib article.
对于某些应用程序,同样可以使用 predefined stylesheets。
简单地导入 import seaborn
也是改变样式的一种可能方法。
创建情节再简单不过了。很明显,需要与要绘制的项目一样多的绘图命令。创建像
这样的图形和坐标轴fig, ax = plt.subplots()
虽然节省了一行。
同样,如果需要自定义 刻度或刻度标记,则无法进行任何简化。然而,人们可能会考虑为此目的使用 Tickers and Formatters。
最后当然可以考虑编写一个自定义函数来执行其中大部分任务,但每个人都可以决定这是否对自己有用。
四处浏览我看到了这个wabe page。 这行代码可以概括很多设置
import matplotlib as mpl
mpl.rc('lines', linewidth=2, color='r')