如何在Python上制作简单有效的图表

时间:2017-03-24 10:18:14

标签: python matplotlib seaborn

我使用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和/或seaborn中是否有任何实现,我可以提供所有这些绘图设置,仅作为函数的参数?它可以大大减少代码行的数量,使脚本更易于编写和理解。

2 个答案:

答案 0 :(得分:1)

Matplotlib提供面向对象的API。这意味着图中的所有元素都是实际对象,人们可以获取和设置属性,并且可以轻松操作。这使得matplotlib非常灵活,几乎可以产生你想象的任何情节。

由于绘图可能包含一百个或更多元素,因此允许相同灵活性的函数需要大量可能的参数。记住函数的所有可能参数并不一定比类的所有可能属性更容易。

执行所有这一切的单个函数调用并不一定意味着您必须键入较少的字符。这些命令的排序方式不同。

此外,面向对象的方法允许保持分离。轴的某些属性(如网格或轴标签)完全独立于您绘制到轴上的内容。因此,您不希望在调用plot时设置xticks,因为它们根本不相关,当在同一轴上绘制两条线时,设置两次相同的ticklabel可能会非常混乱。

另一方面,matplotlib 非常容易。为了产生一个图,你需要两行

import matplotlib.pyplot as plt
plt.plot([1,2,3],[2,1,3])

可以根据需要精确设置大部分参数。您想要自定义此绘图的次数越多,您需要应用的设置就越多。这很好,因为它允许用户自己确定他想要控制情节外观的深度。

大多数matplotlib代码可以分为三个部分。

  1. 设置样式
  2. 创建情节
  3. 自定义情节
  4. 在问题代码的情况下设置样式涉及例如ticklabel大小和网格的使用。这些属性可以设置为在代码中完成,但实际上可能是一个人总是希望在这里使用相同的特性并且发现在每次创建绘图时键入相同的参数都很烦人。因此,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用于此目的。

    最后,当然可以考虑编写一个执行大部分任务的自定义函数,但是每个人都可以决定这对自己是否有用。

答案 1 :(得分:0)

浏览我看到wabe page。 这行代码可以总结许多设置

import matplotlib as mpl
mpl.rc('lines', linewidth=2, color='r')