感谢您帮助我正确绘制这张图!
我现在有另一个问题,我想将阴影线的颜色更改为灰色。
我正在使用matplotlib版本1.5.3'。我已经尝试过mlp.rcParams ['hatch.color'] ='k'
但这似乎不起作用...
这是我已经拥有的图形的代码,感谢您:
import seaborn as sns
import matplotlib.pyplot as plt
mypallet = sns.color_palette([(190/256,7/256, 18/256),(127/256, 127/256, 127/256)])
import itertools
import numpy as np
plt.rcParams['figure.figsize'] = 7, 5
tips = sns.load_dataset("tips")
tips[(tips.day=='Thur') & (tips.sex=='Female') ] = np.nan
print(sns.__version__)
print(tips.head())
# Bigger than normal fonts
sns.set(font_scale=1.5)
ax = sns.swarmplot(x="day", y="total_bill", hue="sex",
data=tips, dodge=True, color='k')
#get first patchcollection
c0 = ax.get_children()[0]
x,y = np.array(c0.get_offsets()).T
#Add .2 to x values
xnew=x+.2
offsets = list(zip(xnew,y))
#set newoffsets
c0.set_offsets(offsets)
ax = sns.barplot(x="day", y="total_bill", hue="sex",
data=tips, capsize=0.1, alpha=0.8,
errwidth=1.25, ci=None, palette=mypallet)
xcentres = [0.2, 1, 2, 3]
delt = 0.2
xneg = [x-delt for x in xcentres]
xpos = [x+delt for x in xcentres]
xvals = xneg + xpos
xvals.sort()
yvals = tips.groupby(["day", "sex"]).mean().total_bill
yerr = tips.groupby(["day", "sex"]).std().total_bill
(_, caps, _)=ax.errorbar(x=xvals, y=yvals, yerr=yerr, capsize=4,
ecolor="red", elinewidth=1.25, fmt='none')
for cap in caps:
cap.set_markeredgewidth(2)
handles, labels = ax.get_legend_handles_labels()
l = ax.legend(handles[0:2], labels[0:2]) # changed based on https://stackoverflow.com/a/42768387/8508004
#sns.ax.ylim([0,60]) #original
ax.set_ylim([0,60]) # adapted from https://stackoverflow.com/a/49049501/8508004 and change to legend
ax.set_ylabel("Out-of-sample R2") # based on https://stackoverflow.com/a/46235777/8508004
ax.set_xlabel("") # based on https://stackoverflow.com/a/46235777/8508004
for i, bar in enumerate(ax.patches):
hatch = '///'
bar.set_hatch(hatch)
bar.set_x(bar.get_x() + bar.get_width()/2)
break
我想将填充图案的颜色从黑色更改为灰色:(127/256,127/256,127/256)
答案 0 :(得分:1)
AFAIK,阴影线的颜色由edgecolor
属性确定,但是问题在于它也会影响条形图的边框
顺便说一句,我在代码末尾对您的循环感到困惑,我将其重写为:
(...)
ax.set_xlabel("") # based on https://stackoverflow.com/a/46235777/8508004
bar = ax.patches[0] # modify properties of first bar (index 0)
hatch = '///'
bar.set_hatch(hatch)
bar.set_x(bar.get_x() + bar.get_width()/2)
bar.set_edgecolor([0.5,0.5,0.5])
要更改阴影线的线宽,似乎必须修改rcParams。您可以将其添加到脚本顶部附近的位置:
plt.rcParams['hatch.linewidth'] = 3
答案 1 :(得分:0)
添加plt.rcParams['hatch.linewidth'] = 3
并使用set_edgecolor
,认为`plt.rcParams ['hatch.color'] ='k'无效的事实是一个错误。
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib as mpl
mypallet = sns.color_palette([(190/256,7/256, 18/256),(127/256, 127/256, 127/256)])
import itertools
import numpy as np
plt.rcParams['figure.figsize'] = 7, 5
plt.rcParams['hatch.linewidth'] = 3
tips = sns.load_dataset("tips")
tips[(tips.day=='Thur') & (tips.sex=='Female') ] = np.nan
print(sns.__version__)
print(tips.head())
# Bigger than normal fonts
sns.set(font_scale=1.5)
ax = sns.swarmplot(x="day", y="total_bill", hue="sex",
data=tips, dodge=True, color='k')
#get first patchcollection
c0 = ax.get_children()[0]
x,y = np.array(c0.get_offsets()).T
#Add .2 to x values
xnew=x+.2
offsets = list(zip(xnew,y))
#set newoffsets
c0.set_offsets(offsets)
ax = sns.barplot(x="day", y="total_bill", hue="sex",
data=tips, capsize=0.1, alpha=0.8,
errwidth=1.25, ci=None, palette=mypallet)
xcentres = [0.2, 1, 2, 3]
delt = 0.2
xneg = [x-delt for x in xcentres]
xpos = [x+delt for x in xcentres]
xvals = xneg + xpos
xvals.sort()
yvals = tips.groupby(["day", "sex"]).mean().total_bill
yerr = tips.groupby(["day", "sex"]).std().total_bill
(_, caps, _)=ax.errorbar(x=xvals, y=yvals, yerr=yerr, capsize=4,
ecolor="red", elinewidth=1.25, fmt='none')
for cap in caps:
cap.set_markeredgewidth(2)
handles, labels = ax.get_legend_handles_labels()
l = ax.legend(handles[0:2], labels[0:2]) # changed based on https://stackoverflow.com/a/42768387/8508004
#sns.ax.ylim([0,60]) #original
ax.set_ylim([0,60]) # adapted from https://stackoverflow.com/a/49049501/8508004 and change to legend
ax.set_ylabel("Out-of-sample R2") # based on https://stackoverflow.com/a/46235777/8508004
ax.set_xlabel("") # based on https://stackoverflow.com/a/46235777/8508004
for i, bar in enumerate(ax.patches):
hatch = '///'
bar.set_hatch(hatch)
bar.set_edgecolor('k')
bar.set_x(bar.get_x() + bar.get_width()/2)
break
输出:
答案 2 :(得分:0)
plt.rcParams.update({'hatch.color': 'k'})
答案 3 :(得分:0)
对于可能还发现舱口未显示或颜色不正确的人,仅提供两个额外提示。
首先,检查您是否在其他地方设置了一些边缘颜色。这似乎优先于指定的填充颜色。
其次,如果您绘制 Patch,请使用 facecolor
而不是 color
。使用 color
,舱口将不可见:
所以不是这个:
from matplotlib.patches import Polygon, Patch
fig, ax = plt.subplots()
ax.legend(handles=[Patch(color='red', hatch='///')]) # no hatch visible
plt.show()
相反:
from matplotlib.patches import Polygon, Patch
fig, ax = plt.subplots()
ax.legend(handles=[Patch(facecolor='red', hatch='///')]) # hatch is now visible
plt.show()