2017-02-12 66 views
2

我有使用海波創建的條形圖。將哈希圖案添加到海邊條形圖

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 
data1 = pd.DataFrame(np.random.rand(17,3), columns=['A','B','C']).assign(Location=1) 
data2 = pd.DataFrame(np.random.rand(17,3)+0.2, columns=['A','B','C']).assign(Location=2) 
data3 = pd.DataFrame(np.random.rand(17,3)+0.4, columns=['A','B','C']).assign(Location=3) 
cdf = pd.concat([data1, data2, data3]) 
mdf = pd.melt(cdf, id_vars=['Location'], var_name=['Letter']) 
ax = sns.barplot(x="Location", y="value", hue="Letter", data=mdf, errwidth=0) 
ax.legend(loc='upper center', bbox_to_anchor=(0.5, 1.2), ncol=3, fancybox=True, shadow=True) 
plt.show() 

這給出了以下情節 enter image description here 我願做自定義圖表如下:

  1. 取下臉上的顏色(設置例如,情節可以如下創建到一個白色)
  2. 添加哈希模式的圖像來區分組 這是如何實現的?

回答

1

刪除臉色很容易,只是做ax.set_facecolor('w'),雖然這會使網格線不可見。在繪圖之前,我建議使用sns.set_style('whitegrid'),否則您將獲得只有水平網格線灰色的白色背景。

至於不同的有模式,這與seaborn有點棘手,但它可以做到。您可以將hatch關鍵字參數傳遞給barplot,但它會應用於每個欄,這並不能真正幫助您區分它們。不幸的是,在這裏傳遞字典是行不通的。相反,您可以在構造它們以應用艙口蓋之後遍歷這些條。你將不得不計算位置的數量,但對於大熊貓來說這很簡單。事實證明,seaborn實際上每個色調都會在前進到下一個色調之前進行繪製,因此在您的示例中,將繪製所有藍色條,然後是所有綠色條,然後是所有紅色條,因此邏輯非常直觀:

num_locations = len(mdf.Location.unique()) 
hatches = itertools.cycle(['/', '//', '+', '-', 'x', '\\', '*', 'o', 'O', '.']) 
for i, bar in enumerate(ax.patches): 
    if i % num_locations == 0: 
     hatch = next(hatches) 
    bar.set_hatch(hatch) 

因此,完整的腳本是

import itertools 
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 
sns.set_style('whitegrid') 
data1 = pd.DataFrame(np.random.rand(17, 3), columns=['A', 'B', 'C']).assign(Location=1) 
data2 = pd.DataFrame(np.random.rand(17, 3) + 0.2, columns=['A', 'B', 'C']).assign(Location=2) 
data3 = pd.DataFrame(np.random.rand(17, 3) + 0.4, columns=['A', 'B', 'C']).assign(Location=3) 
cdf = pd.concat([data1, data2, data3]) 
mdf = pd.melt(cdf, id_vars=['Location'], var_name=['Letter']) 
ax = sns.barplot(x="Location", y="value", hue="Letter", data=mdf, errwidth=0) 

num_locations = len(mdf.Location.unique()) 
hatches = itertools.cycle(['/', '//', '+', '-', 'x', '\\', '*', 'o', 'O', '.']) 
for i, bar in enumerate(ax.patches): 
    if i % num_locations == 0: 
     hatch = next(hatches) 
    bar.set_hatch(hatch) 

ax.legend(loc='upper center', bbox_to_anchor=(0.5, 1.1), ncol=3, fancybox=True, shadow=True) 

plt.show() 

而我得到的輸出

example


參考設置可用艙口和不同艙口:http://matplotlib.org/examples/pylab_examples/hatch_demo.html

注:我調整你的bbox_to_anchor的傳說,因爲它是部分我的電腦上的數字之外。

+1

或者'sns.set_style(「ticks」)' – McGrady

+0

謝謝。正是我在找什麼! –

+0

@McGrady這也可以,我剛剛嘗試過whitegrid,看起來不錯,沒有看到需要繼續嘗試其他風格 – bheklilr