我用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和/或seborn上有没有实现什么东西可以让我把所有这些绘图设置仅仅作为函数的参数来提供?这可以大大减少代码行的数量,使脚本更容易编写和理解。
3条答案
按热度按时间pnwntuvh1#
Matplotlib提供了一个面向对象的API。这意味着图形的所有元素实际上都是对象,用户可以获取和设置属性,并且可以轻松地对其进行操作。这使得matplotlib非常灵活,几乎可以生成任何你想得到的图形。
因为一个图可能包含100个或更多的元素,所以一个具有同样灵活性的函数需要同样数量的可能参数。记住一个函数的所有可能参数并不一定比记住一个类的所有可能属性更容易。
用一个函数调用来完成所有这些操作,并不意味着你必须键入更少的字符,只是命令的顺序不同而已。
此外,面向对象的方法允许保持事物的分离。轴的一些属性,如网格或轴标签,完全独立于你在轴上绘制的内容。因此,你不会想在调用
plot
时设置xticks,因为它们根本不相关,在同一轴上绘制两条线时,设置两次相同的ticklabel可能会非常混乱。另一方面,matplotlib**非常简单。
它可以根据需要精确地设置大多数参数。您越想自定义此绘图,就必须应用越多的设置。这很好,因为它允许用户自己确定他想控制绘图外观的深度。
大多数matplotlib代码可以分为三个部分。
1.设置样式
1.创建地块
1.自定义绘图
设置样式在问题中的代码中涉及到例如ticklabel大小和网格的使用。这些属性可以像代码中一样设置,但实际上可能是人们总是想在这里使用相同的属性,并发现每次创建绘图时都要输入相同的参数。因此matplotlib提供了通用的样式设置。名为rcParams。它们可以在脚本的开头设置,例如:
并将应用于脚本中的所有绘图。也可以使用这些参数定义完整的样式表。有关详细信息,请参阅Customizing matplotlib article。
对于某些应用,同样可以使用predefined stylesheets。
仅导入
import seaborn
也是更改样式的一种可能方法。创建绘图不能再简化了。很明显,需要的绘图命令与要绘图的项目一样多。创建图形和轴,如
但节省了一行。
同样,如果需要自定义刻度或刻度标记,也不可能进行简化。不过,可以考虑使用Tickers and Formatters来实现此目的。
最后,当然可以考虑编写一个自定义函数来执行这些任务中的大部分,但每个人都可以决定这是否对自己有用。
jfewjypa2#
浏览一下,我看到了这个wabe page。
7xzttuei3#
ax.set
在这方面非常有用:您只能设置简单的单参数属性(例如,那些不需要更多关键字的属性),但这是一个很好的时间节省。