Py学习  »  Python

在seaborn-python中的x轴上设置一个扭结

Ben Bitdiddle • 3 年前 • 1659 次点击  

我已经搜索了所有地方,但找不到一个解决方案,如何在seaborn/matplotlib中在x轴上设置一个扭结,如图所示

enter image description here

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/128075
文章 [ 1 ]  |  最新文章 3 年前
JohanC
Reply   •   1 楼
JohanC    3 年前

以下方法:

  • 隐藏 spine 表示现有的x轴
  • 为零添加一个虚拟点(例如在 x=40 )
  • 使用 clip_on=False 在主轴区域外绘制,以及 ax.get_xaxis_transform() 使用 "data coordinates" 对于 x 和“坐标轴” y ( 0 在底部和底部 1 在顶部);厚度和线条颜色是从脊椎复制的
  • 将虚拟零位显示为 0
import matplotlib.pyplot as plt
import numpy as np

data = np.random.randint(50, 89, 80)
bins = np.arange(50, data.max()+6, 5)
fig, ax = plt.subplots(figsize=(12,5))

ax.hist(data, bins=bins, fc='skyblue', ec='navy')
false_zero = bins[0] - 10
ax.set_xticks(np.append(false_zero, bins))
ax.set_xticklabels(np.append(0, bins))

for spine in ['top', 'right', 'bottom']:
    ax.spines[spine].set_visible(False)
ax.add_line(plt.Line2D(xdata=[false_zero, false_zero + 2, false_zero + 4, false_zero + 4, false_zero + 6, bins[-1] + 1],
                       ydata=[0, 0, 0.1, -0.1, 0, 0],
                       color=ax.spines['bottom'].get_edgecolor(), lw=ax.spines['bottom'].get_linewidth(),
                       clip_on=False, transform=ax.get_xaxis_transform()))
plt.tight_layout()
plt.show()

x axis with a kink

PS:对于原始帖子的纠结:

ax.add_line(plt.Line2D(xdata=[false_zero, false_zero + 2, false_zero + 2, false_zero + 6, false_zero + 6, bins[-1] + 1],
                       ydata=[0, 0, 0.1, -0.1, 0, 0], ...))

original kink