2017-02-12 67 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