Shi*_*hah 14 python plot data-visualization matplotlib
默认的matplotlib图看起来真的没有吸引力,甚至不专业.我尝试了几个软件包,包括seaborn和prettyplotlib,但这两个方案几乎都没有改进样式.
到目前为止,我已经开始使用seaborn包了:

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

请注意第二个示例中的以下好处:
我的问题是:你认为上面是某种流行的主题或风格,我可以在matplotlib中快速使用吗?或者,如果我可以从一些包中使用?如果不这样做,那么将这种风格设定为我的全球偏好吗?如果失败了,是否有可能在matlibplot中这样做?
谢谢!
DrV*_*DrV 17
这实际上是一种品味问题,也是目标受众的问题.matplotlib试图为科学目的制作清晰的插图.这是 - 必然 - 妥协,插图不是你在杂志或广告中展示的东西.
matplotlib从这个意义上说,有一些好消息和一些坏消息.
坏消息:
matplotlib.好消息:
在我看来,最困难的事情是决定你想要什么.然后做你想要的更容易,即使在开始时有一个陡峭的学习曲线.
举个例子:
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')
Run Code Online (Sandbox Code Playgroud)
(只是评论:原始图像中的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')
Run Code Online (Sandbox Code Playgroud)
现在我们有:

这与问题不完全相同,但一切都可以朝着这个方向调整.此处设置的许多内容都可以设置为默认值matplotlib.也许这给出了如何改变情节中的事物的想法.
为了更接近您喜欢的风格,您可以使用whitegridseaborn中的风格.正如其他答案所述,您可以使用alpha参数to 控制填充的透明度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)
Run Code Online (Sandbox Code Playgroud)

有关seaborn样式的更多信息可以在文档中找到.
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()
Run Code Online (Sandbox Code Playgroud)

如果您想设置默认值,以便所有绘图看起来都相同,那么您应该生成自定义matplotlibrc file或使用style. 这里有一份有用的指南。要查看所有可用选项的列表,只需print plt.rcParams从交互式终端调用即可。
其他一些功能(例如填充)需要在每个地块的基础上完成。您可以通过创建一个函数来在工作中标准化这一点,该函数在给定的某些输入(例如轴实例和数据)之间添加填充。