自定义小提琴图

此示例演示如何完全自定义小提琴图。 第一个图通过仅提供数据来显示默认样式。第二个图首先限制了matplotlib用额外的kwargs绘制的内容。然后在顶部绘制箱形图的简化表示。 最后,修改了小提琴图的风格。

有关小提琴图的更多信息,scikit-learn文档有一个很棒的部分:http://scikit-learn.org/stable/modules/density.html

自定义小提琴图示例

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. def adjacent_values(vals, q1, q3):
  4. upper_adjacent_value = q3 + (q3 - q1) * 1.5
  5. upper_adjacent_value = np.clip(upper_adjacent_value, q3, vals[-1])
  6. lower_adjacent_value = q1 - (q3 - q1) * 1.5
  7. lower_adjacent_value = np.clip(lower_adjacent_value, vals[0], q1)
  8. return lower_adjacent_value, upper_adjacent_value
  9. def set_axis_style(ax, labels):
  10. ax.get_xaxis().set_tick_params(direction='out')
  11. ax.xaxis.set_ticks_position('bottom')
  12. ax.set_xticks(np.arange(1, len(labels) + 1))
  13. ax.set_xticklabels(labels)
  14. ax.set_xlim(0.25, len(labels) + 0.75)
  15. ax.set_xlabel('Sample name')
  16. # create test data
  17. np.random.seed(19680801)
  18. data = [sorted(np.random.normal(0, std, 100)) for std in range(1, 5)]
  19. fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(9, 4), sharey=True)
  20. ax1.set_title('Default violin plot')
  21. ax1.set_ylabel('Observed values')
  22. ax1.violinplot(data)
  23. ax2.set_title('Customized violin plot')
  24. parts = ax2.violinplot(
  25. data, showmeans=False, showmedians=False,
  26. showextrema=False)
  27. for pc in parts['bodies']:
  28. pc.set_facecolor('#D43F3A')
  29. pc.set_edgecolor('black')
  30. pc.set_alpha(1)
  31. quartile1, medians, quartile3 = np.percentile(data, [25, 50, 75], axis=1)
  32. whiskers = np.array([
  33. adjacent_values(sorted_array, q1, q3)
  34. for sorted_array, q1, q3 in zip(data, quartile1, quartile3)])
  35. whiskersMin, whiskersMax = whiskers[:, 0], whiskers[:, 1]
  36. inds = np.arange(1, len(medians) + 1)
  37. ax2.scatter(inds, medians, marker='o', color='white', s=30, zorder=3)
  38. ax2.vlines(inds, quartile1, quartile3, color='k', linestyle='-', lw=5)
  39. ax2.vlines(inds, whiskersMin, whiskersMax, color='k', linestyle='-', lw=1)
  40. # set style for the axes
  41. labels = ['A', 'B', 'C', 'D']
  42. for ax in [ax1, ax2]:
  43. set_axis_style(ax, labels)
  44. plt.subplots_adjust(bottom=0.15, wspace=0.05)
  45. plt.show()

下载这个示例