2017-02-17 32 views
2

Я хотел бы исправить разрыв между 2012 и 2013 годами в приведенном ниже графике.Как бороться с раздражающим разрывом в панда-баре

enter image description here

Мой dataframe является

In [30]: df 
Out[30]: 
      Pre-Release Post-Release 
FinishDate 
2008    1.0   0.0 
2009    18.0   0.0 
2010    96.0   0.0 
2011    161.0   0.0 
2012    157.0   0.0 
2013    0.0   139.0 
2014    0.0   155.0 
2015    0.0   150.0 
2016    0.0   91.0 
2017    0.0   15.0 

и я использую df.plot(kind='bar', width=1) построить.

+0

'align = 'center'' ?? – jojo

+1

Спасибо, что угадали, но это не устранило пробел. – lanery

+1

Разрыв - это «законный» пробел в том, что вы рисуете сразу две переменные. Измените нули на 10.0, и вы увидите, что происходит (это заставка pre и post side-by-side). –

ответ

3

На вашем графике фактического «пробела» нет. Панды просто резервируют пространство для построения двух разных баров рядом друг с другом. Возьмите этот кусок кода для иллюстрации:

from io import StringIO 
import pandas as pd 
TESTDATA=StringIO("""2008    1.0   0.0 
2009    18.0   5.0 
2010    96.0   0.0 
2011    161.0   0.0 
2012    157.0   0.0 
2013    0.0   139.0 
2014    0.0   155.0 
2015    0.0   150.0 
2016    0.0   91.0 
2017    0.0   15.0""") 
df=pd.read_csv(TESTDATA,delim_whitespace=True,index_col=0) 
df.plot(kind='bar') 

Two bars next to each other

Но вы на самом деле не всегда нужно напечатать два бара рядом друг с другом, так что вместо построения dataframe, вы можете построить два ряда в та же цифра:

ax=df['1.0'].plot(kind='bar') 
df['0.0'].plot(kind='bar',ax=ax,color='orange') 

enter image description here

В качестве альтернативы просто использовать:

df.plot(kind='bar', stacked=True) 

Это дает вам одинаковые результаты в этом случае.

1

Разрыв на самом деле часто является желаемым поведением, так как вы эффективно рисуете две гистограммы.

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

Вот минимальный пример, который вы должны получить там:

import matplotlib.pyplot as plt 
import numpy as np 
import pandas 

someDF = pandas.DataFrame({'1':np.random.uniform(size=20)*10, '2':np.random.uniform(size=20)*10}) 

cut = 10 
fig, ax = plt.subplots(figsize=(8,3)) 

first = someDF['1'][someDF.index >= cut] 
second = someDF['2'][someDF.index < cut] 

ax.bar(left=first.index, height=first, align='center', color='blue') 
ax.bar(left=second.index, height=second, align='center', color='red') 
plt.show() 

выход выглядит то что-то вроде: enter image description here

1

Вы Plot два набора данных для каждого года. Таким образом, на каждом узле по оси x нанесены два столбца для обоих наборов данных. Вы не можете их видеть, потому что значения равны нулю. Я думаю, что ключевое слово stacked=True может работать. Это ставит оба набора данных по вертикали и отсутствие пробелов.