Python Seaborn箱线图单个箱间距
如何增加seaborn箱线图中两个specefic箱之间的空间?在tips数据集中,如何在不影响其他框的情况下修改Sat和Sun之间的间距。我已经在dataframe中包含了空列,但是通过这种解决方法,无法控制间距Python Seaborn箱线图单个箱间距,python,matplotlib,seaborn,boxplot,Python,Matplotlib,Seaborn,Boxplot,如何增加seaborn箱线图中两个specefic箱之间的空间?在tips数据集中,如何在不影响其他框的情况下修改Sat和Sun之间的间距。我已经在dataframe中包含了空列,但是通过这种解决方法,无法控制间距 %matplotlib inline import seaborn as sns tips = sns.load_dataset("tips") ax = sns.boxplot(x="day", y="total_bill", data=tips) 据我所知,seaborn不可能
%matplotlib inline
import seaborn as sns
tips = sns.load_dataset("tips")
ax = sns.boxplot(x="day", y="total_bill", data=tips)
据我所知,seaborn不可能做到这一点,因为遗憾的是它没有提供任何修改
位置
关键字的方法。另见
最简单的解决方法是使用不同的boxplot函数,例如数据帧附带的函数:
bplot = tips.boxplot(by="day", column="total_bill", positions=[1,2,3,4.5])
当然,这远没有seaborn版本的风格好
幸运的是,matplotlib为那些愿意探索它们的人提供了无限的选择,因此可以通过相应地修改绘图的不同部分来创建类似于seaborn绘图的内容
这很接近:
# Prep
import matplotlib.pyplot as plt
import seaborn as sns
tips = sns.load_dataset("tips")
# Create boxplot
bplot = tips.boxplot(by="day", column="total_bill", positions=[1,2,3,4.5],
return_type='dict', figsize=(8,6), grid=False, patch_artist=True,
sym='d', fontsize=16)
# Style boxplot
colors = ['blue', 'green', 'red', 'cyan']
for patch, color in zip(bplot['total_bill']['boxes'], colors):
patch.set_facecolor(color)
patch.set_edgecolor('0.2')
patch.set_linewidth(1.5)
for whisker in bplot['total_bill']['whiskers']:
whisker.set_color('0.2')
whisker.set_linewidth(1.5)
for fliers in bplot['total_bill']['fliers']:
fliers.set_markerfacecolor('0.2')
for median in bplot['total_bill']['medians']:
median.set_color('0.2')
median.set_linewidth(1.5)
for caps in bplot['total_bill']['caps']:
caps.set_color('0.2')
caps.set_linewidth(1.5)
# Other adjustments
plt.title("")
plt.suptitle("")
plt.xlabel("day", fontsize=18)
plt.ylabel("total_bill", fontsize=18)
Seaborn不提供此功能(参见示例)。打印框后,仍可以调整matplotlib:
ax = plt.gca() # Or get the axis another way
def _reduce_box_width(artist, factor=.5):
vertices = artist.get_path().vertices
artist_width = vertices[1, 0] - vertices[0, 0]
vertices[0, 0] += artist_width * (factor/2)
vertices[1, 0] -= artist_width * (factor/2)
vertices[2, 0] -= artist_width * (factor/2)
vertices[3, 0] += artist_width * (factor/2)
vertices[4, 0] += artist_width * (factor/2)
for artist in ax.artists:
_reduce_box_width(artist, factor=.5)
def _reduce_horizontal_line_width(artist, factor=.5):
vertices = artist.get_path().vertices
artist_width = vertices[1, 0] - vertices[0, 0]
vertices[0, 0] += artist_width * (factor/2)
vertices[1, 0] -= artist_width * (factor/2)
horizontal_lines = [l for l in ax.lines
if len(l.get_path().vertices) != 0 and
l.get_path().vertices[0, 1] = = l.get_path().vertices[1, 1]]
for line in horizontal_lines:
_reduce_horizontal_line_width(line)
ax.redraw_in_frame()
它可能需要根据您的具体情况进行调整