首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使matplotlib图看起来像这样专业?

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

Stack Overflow用户
提问于 2014-07-03 07:02:09
回答 4查看 47.7K关注 0票数 18

默认的matplotlib图看起来非常不吸引人,甚至不专业。我试过了几个包,包括海运包和prettyplotlib包,但这两个包都几乎没有改进样式。

到目前为止,我已经使用海运包进行了如下操作:

下面是我正在寻找的外表,它与上面的相去甚远:

请注意第二个示例中的以下优点:

  1. 图下的区域充满了更令人赏心悦目的颜色。
  2. 这条图形线是思考者,很好地脱颖而出。
  3. 轴线是思考者,再次出色地脱颖而出。
  4. 曲线下的区域是透明的。
  5. X轴的刻痕密度更大.

我的问题是:您是否认识到上面是某种流行的主题或风格,我可以很快地在matplotlib中使用?或者我能用一些包裹吗?如果做不到这一点,我是否会把这种风格作为我的全球偏好呢?如果做不到这一点,那么是否有可能在matlibplot中这样做呢?

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-03 09:11:50

这确实是一个品味的问题,也是一个目标受众的问题。matplotlib试图为科学目的制作清晰的插图。这是一种妥协,插图并不是你会在杂志上或广告上展示的东西。

在这个意义上,matplotlib有一些好消息,也有一些坏消息。

坏消息:

  • 没有一个神奇的命令或软件包可以用matplotlib创建美丽的情节。

好消息:

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

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

作为一个例子:

代码语言:javascript
复制
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轴限制没有考虑数据的周期性。)

这会给我们这样的东西:

很容易理解,我们需要做很多改变,以便能够向不太注重工程的观众展示这一点。至少:

  • 使填充物透明,减少颜色的冒犯性。
  • 使线路变厚
  • 改变线条颜色
  • 在X轴上添加更多的刻度
  • 更改标题的字体
代码语言:javascript
复制
# 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')

现在我们有:

这与问题中的情况不完全一样,但一切都可以朝着这个方向调整。这里设置的许多东西都可以设置为matplotlib的默认设置。也许这给出了一个如何在情节中改变事物的想法。

票数 27
EN

Stack Overflow用户

发布于 2014-07-04 14:38:36

为了更接近您喜欢的样式,您可以在海运中使用whitegrid样式。正如其他答案所指出的,您可以控制alpha参数填充到fill_between的透明性。

代码语言:javascript
复制
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)

有关海运样式的更多信息可以在文档中找到。

票数 15
EN

Stack Overflow用户

发布于 2014-07-03 08:56:44

matplotlib几乎是无限灵活的,所以您几乎可以使用它做任何事情,如果它不存在,您可以自己编写它!显然,默认设置是平淡的,这是因为每个人都对什么是“好的”有自己的想法,所以强加一种预定义的风格是毫无意义的。

下面是一个非常简单的例子,它涉及到您的4个要点。

代码语言:javascript
复制
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()

如果您希望设置默认值,那么您的所有情节看起来都一样,那么您应该生成一个自定义matplotlibrc file或使用style。一个有用的导游来了。要查看所有可用选项的列表,只需从交互式终端调用print plt.rcParams即可。

其他一些功能,如填充,将需要在每个地块的基础上进行。您可以通过创建一个函数,在给定的输入(如轴、实例和数据)之间添加填充,从而实现整个工作的标准化。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24547047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档