Почему мой барплот превращается в линейный график, когда я пытаюсь создать прерывистую ось? - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь создать прерывистую ось Y на гистограмме.Я могу разбить ось так, как хочу, но полученный график выглядит как линейный график моих данных вместо исходного гистограммы, который у меня был.На прикрепленном изображении я хочу, чтобы гистограмма на верхней оси отображалась на кадрах оси нижнего графика.

Спасибо.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
df = pd.DataFrame(np.c_[PURO, MYC, HRAS, CYCD, AURKB], index=Phenotype)
df.plot.bar()

plt.xlabel('Phenotype (# of poles, total # of centrioles)')
plt.ylabel('# of cells')

fig, (ax, ax2) = plt.subplots(2, 1, sharex=True, sharey=False)

ax.plot(df)
ax2.plot(df)


ax.set_ylim(40,100) 
ax2.set_ylim(0,20)

ax.spines['bottom'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax.xaxis.tick_top()
ax.tick_params(labeltop='off')  # don't put tick labels at the top
ax2.xaxis.tick_bottom()

plt.show()

Итоговые сюжеты

1 Ответ

0 голосов
/ 15 сентября 2018

Проблема заключается в том, что вы сначала строите гистограмму, а затем удваиваете кадры данных, используя ax.plot() и ax2.plot(), которые просто отображают соединительные линии.

Решение : Удалить следующую строку

df.plot.bar() 

и заменить ax.plot(df) и ax2.plot(df) на

df.plot.bar(ax=ax) 
df.plot.bar(ax=ax2)

Ниже приведен минимальныйрабочий ответ (исключая импорт) для вас с использованием фиктивного фрейма данных .То же самое будет работать и для вашего случая.

fig = plt.figure(figsize=(8, 6))

df = pd.DataFrame({'count': {0: 88, 1: 67, 2: 10, 3: 16, 4: 18}}).reset_index()
fig, (ax, ax2) = plt.subplots(2, 1, sharex=True, sharey=False)

df.plot.bar(x='index', y='count', legend=False, ax=ax)
df.plot.bar(x='index', y='count', legend=False, ax=ax2)

ax.set_ylim(50,100) 
ax2.set_ylim(0,20)

ax.spines['bottom'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax.xaxis.tick_top()
ax.tick_params(labeltop='off')  # don't put tick labels at the top
ax2.xaxis.tick_bottom()

Вы можете добавить диагонали / маленькие линии, чтобы выделить пунктирные линии, просто скопировав строки из этого официального примера

Выход

enter image description here

...