Как построить гистограмму из серии pandas?

#python #pandas #matplotlib

#pandas #matplotlib #построить #ipython #Серии

Вопрос:

Рассмотрим мою серию, как показано ниже: первый столбец — article_id, а второй столбец — количество частот.

 article_id  
1         39 
2         49 
3        187 
4        159 
5        158 
        ...  
16947     14 
16948      7 
16976      2 
16977      1 
16978      1 
16980      1 

Name: article_id, dtype: int64
  

Я получил эту серию из фрейма данных с помощью следующей команды:

 logs.loc[logs['article_id'] <= 17029].groupby('article_id')['article_id'].count()
  

logs — это фрейм данных здесь, а article_id — один из столбцов в нем.

Как мне построить гистограмму (используя Matlplotlib) так, чтобы article_id находился на оси X, а счетчик частоты — на оси Y?

Моим естественным инстинктом было преобразовать его в список с помощью .tolist(), но это не сохраняет article_id .

Комментарии:

1. Подобные вопросы действительно заставляют меня задуматься, пытаются ли люди искать в Google или читать документы, прежде чем спрашивать здесь. pandas.pydata.org/pandas-docs/stable/visualization.html

Ответ №1:

IIUC вам нужен Series.plot.bar :

 #pandas 0.17.0 and above
s.plot.bar()
#pandas below 0.17.0
s.plot('bar')
  

Пример:

 import pandas as pd
import matplotlib.pyplot as plt

s = pd.Series({16976: 2, 1: 39, 2: 49, 3: 187, 4: 159, 
               5: 158, 16947: 14, 16977: 1, 16948: 7, 16978: 1, 16980: 1},
               name='article_id')
print (s)
1         39
2         49
3        187
4        159
5        158
16947     14
16948      7
16976      2
16977      1
16978      1
16980      1
Name: article_id, dtype: int64


s.plot.bar()

plt.show()
  

График

Комментарии:

1. Спасибо. Есть предложения по увеличению размера графика? У меня 16980 разных значений на графике, и это выглядит немного сгущенным. Я попытался использовать plt.figure(figsize = (20,10)). PS Я использую встроенный график.

2. plt.figure(figsize=(20,10)) before s.plot.bar() работает для меня очень хорошо.

3. Сработало. Я помещал его после s.plot.bar()

4. @NishantKumar — Если нужны значения сортировки s = s.sort_values().plot.bar() и если индекс для оси-x, то s = s.sort_index().plot.bar()

Ответ №2:

Новый pandas API предлагает следующий способ:

 import pandas as pd

s = pd.Series({16976: 2, 1: 39, 2: 49, 3: 187, 4: 159, 
               5: 158, 16947: 14, 16977: 1, 16948: 7, 16978: 1, 16980: 1},
               name='article_id')

s.plot(kind="bar", figsize=(20,10))
  

Если вы работаете с Jupyter, вам не нужна matplotlib библиотека.

Ответ №3:

Просто используйте «bar» в качестве параметра plot

Пример

 series = read_csv('BwsCount.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
series.plot(kind='bar')
  

Значение вида по умолчанию равно «line» (т.е. series.plot() —> автоматически построит линейный график)

Для справки:

 kind : str
        ‘line’ : line plot (default)
        ‘bar’ : vertical bar plot
        ‘barh’ : horizontal bar plot
        ‘hist’ : histogram
        ‘box’ : boxplot
        ‘kde’ : Kernel Density Estimation plot
        ‘density’ : same as ‘kde’
        ‘area’ : area plot
        ‘pie’ : pie plot