2014-07-03 73 views
10

默認的matplotlib圖形看起來真的沒有吸引力,甚至不專業。我嘗試了幾個軟件包,包括seaborn以及prettyplotlib,但這兩種軟件幾乎沒有改進樣式。如何使matplotlib圖像看起來像這樣專業地完成?

到目前爲止,我已經得到了使用seaborn包以下:

enter image description here

下面是我要找的外觀是相去甚遠以上:

enter image description here

在第二個示例中注意以下幾點:

  1. 圖下的區域充滿了更多令人愉悅的色彩。
  2. 圖線是思想家,很好地脫穎而出。
  3. 軸線是思想家,並且很好地脫穎而出。
  4. 曲線下面的區域是透明的。
  5. X軸刻度線更加密集。

我的問題是:您是否認識到上面是某種流行的主題或風格,我可以在matplotlib中快速使用?或者如果我可以使用一些包?如果沒有,那麼是否有將這種風格設置爲我的全球偏好?如果沒有這個,是否可以在matlibplot中做到這一點?

謝謝!

+7

我不會把底部的一個專業做。看起來像是出自excel的東西。 – tacaswell

回答

15

這確實是一個品味問題,也是目標受衆的問題。 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的默認值。也許這給出瞭如何改變情節的想法。

+0

謝謝。有沒有什麼辦法可以讓盒子的頂部和右側邊緣變灰? – ShitalShah

+1

@ShitalShah:它是,看到代碼。關鍵字是「脊柱」(可能有點難以猜到)。 – DrV

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

一些其他的功能,如填充將需要在每個情節的基礎上完成。通過創建一個函數,可以在給定的某些輸入(例如軸實例和數據)之間添加填充,從而在整個工作中對此進行標準化。

6

爲了更貼近您喜歡的風格,您可以使用海寶的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) 
上seaborn風格

enter image description here

更多信息可以在docs找到。

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() 
相關問題