如何使matplotlib图像看起来像这样专业?

时间:2014-07-03 07:02:10

标签: python matplotlib plot data-visualization

默认的matplotlib图看起来真的没有吸引力,甚至不专业。我尝试了几个软件包,包括seaborn和prettyplotlib,但这两个方案几乎都没有改进样式。

到目前为止,我已经开始使用seaborn包了:

enter image description here

以下是我正在寻找的与上面相差甚远的外观:

enter image description here

请注意第二个例子中的以下好处:

  1. 图表下方的区域充满了令人赏心悦目的色彩。
  2. 图表线是思想家,非常突出。
  3. Axis系列是思想家,并再次脱颖而出。
  4. 曲线下方的区域是透明的。
  5. X轴刻度标记更密集。
  6. 我的问题是:你认为上面是我可以在matplotlib中快速使用的某种流行主题或风格吗?或者,如果我可以从一些包中使用?如果不这样做,那么将这种风格设定为我的全球偏好吗?如果做不到这一点,甚至可以在matlibplot中做到这一点吗?

    谢谢!

4 个答案:

答案 0 :(得分:17)

这实际上是品味问题,也是目标受众的问题。 matplotlib试图为科学目的制作清晰的插图。这是 - 必然 - 妥协,插图不是你在杂志或广告中打印的东西。

在这个意义上,有一些好消息和一些关于matplotlib的坏消息。

坏消息:

  • 没有一个神奇的命令或包可以用matplotlib创建漂亮的情节。

好消息:

  • 有多种简单方法可以更改默认设置,请参阅:http://matplotlib.org/users/customizing.html
  • 对象模型使用户能够更改几乎所有内容并引入复杂的新功能。
  • 源代码可用,甚至可以由用户轻松更改。

在我看来,最困难的事情是决定你想要什么。然后做你想做的事情会更容易,即使在开始时有一个陡峭的学习曲线。

仅作为一个例子:

import numpy as np
import matplotlib.pyplot as plt


# create some fictive access data by hour
xdata = np.arange(25)
ydata = np.random.randint(10, 20, 25)
ydata[24] = ydata[0]

# let us make a simple graph
fig = plt.figure(figsize=[7,5])
ax = plt.subplot(111)
l = ax.fill_between(xdata, ydata)

# set the basic properties
ax.set_xlabel('Time of posting (US EST)')
ax.set_ylabel('Percentage of Frontpaged Submissions')
ax.set_title('Likelihood of Reaching the Frontpage')

# set the limits
ax.set_xlim(0, 24)
ax.set_ylim(6, 24)

# set the grid on
ax.grid('on')

(只是评论:原始图像中的X轴限制不会考虑数据的周期性。)

这会给我们这样的事情:

enter image description here

很容易理解,我们需要做很多更改才能向缺乏工程意识的观众展示这一点。至少:

  • 使填充变得透明且不那么令人反感
  • 使线条变粗
  • 更改线条颜色
  • 向X轴添加更多刻度
  • 更改标题的字体

# change the fill into a blueish color with opacity .3
l.set_facecolors([[.5,.5,.8,.3]])

# change the edge color (bluish and transparentish) and thickness
l.set_edgecolors([[0, 0, .5, .3]])
l.set_linewidths([3])

# add more ticks
ax.set_xticks(np.arange(25))
# remove tick marks
ax.xaxis.set_tick_params(size=0)
ax.yaxis.set_tick_params(size=0)

# change the color of the top and right spines to opaque gray
ax.spines['right'].set_color((.8,.8,.8))
ax.spines['top'].set_color((.8,.8,.8))

# tweak the axis labels
xlab = ax.xaxis.get_label()
ylab = ax.yaxis.get_label()

xlab.set_style('italic')
xlab.set_size(10)
ylab.set_style('italic')
ylab.set_size(10)

# tweak the title
ttl = ax.title
ttl.set_weight('bold')

现在我们有:

enter image description here

这与问题不完全相同,但一切都可以朝着这个方向调整。此处设置的许多内容都可以设置为matplotlib的默认值。也许这会给出如何改变情节中的事物的想法。

答案 1 :(得分:6)

为了更接近您喜欢的风格,您可以在seaborn中使用whitegrid风格。正如其他答案所述,您可以使用alpha参数控制填充的透明度为fill_between

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style("whitegrid")

blue, = sns.color_palette("muted", 1)

x = np.arange(23)
y = np.random.randint(8, 20, 23)

fig, ax = plt.subplots()
ax.plot(x, y, color=blue, lw=3)
ax.fill_between(x, 0, y, alpha=.3)
ax.set(xlim=(0, len(x) - 1), ylim=(0, None), xticks=x)

enter image description here

有关seaborn样式的更多信息,请参阅docs

答案 2 :(得分:2)

matplotlib几乎是无限灵活的,所以你可以用它做任何事情,如果它不存在,你可以自己写!显然,默认值是平淡无奇的,这是因为每个人都有自己对“好”的看法,因此强加预定义的风格毫无意义。

这是一个非常简单的例子,可以解决你的4个问题。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

x = np.linspace(-10, 10, 1000)
y = 1+np.sinc(x)

ax = plt.subplot(111)
ax.plot(x, y, lw=2)
ax.fill_between(x, 0, y, alpha=0.2)
ax.grid()

majorLocator   = MultipleLocator(1)
ax.xaxis.set_major_locator(majorLocator)

plt.show()

enter image description here

如果您想设置默认值以使所有图表看起来都相同,那么您应该生成自定义matplotlibrc file。一个有用的guide is here。要查看所有可用选项的列表,只需从交互式终端呼叫print plt.rcParams即可。

其他一些功能,例如填充,需要在每个情节的基础上完成。您可以通过创建一个函数来标准化您的工作,该函数在给定的输入(如轴实例和数据)之间添加填充。

答案 3 :(得分:1)

您可以自定义绘图样式,如下所示:

import numpy as np
import matplotlib.pyplot as plt
plt.use_style('ggplot') # customize your plots style
x = np.linspace(0,2*np.pi,100)
y = np.sin(x)
plt.fill_between(x,y)
plt.show()