边距箱线图 Matplotlib
Margin Boxplots Matplotlib
我想手动为以下代码生成的箱线图添加边距。目前,箱线图在角落(末端)太多了。通常会有很多箱线图(与此示例代码不同),我希望箱线图等间距(如代码中所示),但我希望两侧有边距。
我使用的是 matplotlib 版本 1.3.1
import matplotlib.pyplot as plt
statistic_dict = {0.40000000000000002: [0.36003616645322273, 0.40526649416305677, 0.46522159350924536], 0.20000000000000001: [0.11932912803730165, 0.23235825966896217, 0.12380728472472625]}
def draw_boxplot(y_values, x_values, edge_color, fill_color):
bp = plt.boxplot(y_values, patch_artist=True, positions=x_values, widths=(0.05,0.05))
for element in ['boxes', 'whiskers', 'fliers', 'medians', 'caps']:
plt.setp(bp[element], color=edge_color)
plt.xlabel("x label ")
plt.ylabel("y label ")
plt.title("Title")
for patch in bp['boxes']:
patch.set(facecolor=fill_color)
y_values = statistic_dict.values()
x_values = statistic_dict.keys()
draw_boxplot(y_values, x_values, "skyblue", "white")
plt.gca().autoscale()
plt.savefig('fileName.png', bbox_inches='tight')
plt.close()
如果 ax.margins()
未按预期工作,以下是一个 hacky 解决方法。
import numpy as np
import matplotlib.pyplot as plt
statistic_dict = {0.40: [0.36, 0.40, 0.46],
0.20: [0.11, 0.23, 0.12],
0.70: [0.19, 0.23, 0.12]}
def draw_boxplot(y_values, x_values, edge_color, fill_color):
bp = plt.boxplot(y_values, patch_artist=True, positions=x_values)
for element in ['boxes', 'whiskers', 'fliers', 'medians', 'caps']:
plt.setp(bp[element], color=edge_color)
plt.xlabel("x label ")
plt.ylabel("y label ")
plt.title("Title")
for patch in bp['boxes']:
patch.set(facecolor=fill_color)
v = np.array([box.get_path().vertices for box in bp['boxes']])
margin=0.2
xmin = v[:,:5,0].min() - (max(x_values)-min(x_values))*margin
xmax = v[:,:5,0].max() + (max(x_values)-min(x_values))*margin
plt.xlim(xmin, xmax)
y_values = statistic_dict.values()
x_values = statistic_dict.keys()
draw_boxplot(y_values, x_values, "skyblue", "white")
plt.show()
我想手动为以下代码生成的箱线图添加边距。目前,箱线图在角落(末端)太多了。通常会有很多箱线图(与此示例代码不同),我希望箱线图等间距(如代码中所示),但我希望两侧有边距。
我使用的是 matplotlib 版本 1.3.1
import matplotlib.pyplot as plt
statistic_dict = {0.40000000000000002: [0.36003616645322273, 0.40526649416305677, 0.46522159350924536], 0.20000000000000001: [0.11932912803730165, 0.23235825966896217, 0.12380728472472625]}
def draw_boxplot(y_values, x_values, edge_color, fill_color):
bp = plt.boxplot(y_values, patch_artist=True, positions=x_values, widths=(0.05,0.05))
for element in ['boxes', 'whiskers', 'fliers', 'medians', 'caps']:
plt.setp(bp[element], color=edge_color)
plt.xlabel("x label ")
plt.ylabel("y label ")
plt.title("Title")
for patch in bp['boxes']:
patch.set(facecolor=fill_color)
y_values = statistic_dict.values()
x_values = statistic_dict.keys()
draw_boxplot(y_values, x_values, "skyblue", "white")
plt.gca().autoscale()
plt.savefig('fileName.png', bbox_inches='tight')
plt.close()
如果 ax.margins()
未按预期工作,以下是一个 hacky 解决方法。
import numpy as np
import matplotlib.pyplot as plt
statistic_dict = {0.40: [0.36, 0.40, 0.46],
0.20: [0.11, 0.23, 0.12],
0.70: [0.19, 0.23, 0.12]}
def draw_boxplot(y_values, x_values, edge_color, fill_color):
bp = plt.boxplot(y_values, patch_artist=True, positions=x_values)
for element in ['boxes', 'whiskers', 'fliers', 'medians', 'caps']:
plt.setp(bp[element], color=edge_color)
plt.xlabel("x label ")
plt.ylabel("y label ")
plt.title("Title")
for patch in bp['boxes']:
patch.set(facecolor=fill_color)
v = np.array([box.get_path().vertices for box in bp['boxes']])
margin=0.2
xmin = v[:,:5,0].min() - (max(x_values)-min(x_values))*margin
xmax = v[:,:5,0].max() + (max(x_values)-min(x_values))*margin
plt.xlim(xmin, xmax)
y_values = statistic_dict.values()
x_values = statistic_dict.keys()
draw_boxplot(y_values, x_values, "skyblue", "white")
plt.show()