Пузырьковый график или тепловая карта в matplotlib

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

Вход:

Nos,Place,Way,Name,00:00:00,12:00:00
123,London,Air,Apollo,342,972
123,London,Rail,Beta,2352,342
123,Paris,Bus,Beta,545,353
345,Paris,Bus,Rava,652,974
345,Rome,Bus,Rava,2325,56
345,London,Air,Rava,2532,9853
567,Paris,Air,Apollo,545,544
567,Rome,Rail,Apollo,5454,5
876,Japan,Rail,Apollo,644,54
876,Japan,Bus,Beta,45,57

Программа:

import pandas as pd
from pandas import DataFrame
import pandas.io.data
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns


df=pd.read_csv('text_2.csv')


#SIZE OF BUBBLES CHANGES

fig = plt.figure()

ax = fig.add_subplot(1,1,1)

ax.scatter(df['Place'],df['Name'], s=df['00:00:00']) # Added third variable income as size of the bubble


plt.show()

Я пытаюсь поставить Place как x axis, а Name как y axis и Size, которые нужно взять из count(00:00). Значительный пузырь Я не мог найти много примеров вокруг. Любые ценные предложения присваиваются. Заранее спасибо. Почему я получаю сообщение об ошибке в столбце (00:00) и как передать значения этого столбца?

Ошибка:

    Traceback (most recent call last):
  File "Bubble_plot.py", line 18, in <module>
    ax.scatter(df['Place'],df['Name'], s=df['00:00:00']) # Added third variable income as size of the bubble
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 6266, in scatter
    x, y, s, c = cbook.delete_masked_points(x, y, s, c)
  File "/usr/lib/pymodules/python2.7/matplotlib/cbook.py", line 1774, in delete_masked_points
    raise ValueError("First argument must be a sequence")
ValueError: First argument must be a sequence

person Community    schedule 26.06.2015    source источник
comment
В чем именно заключается ваш вопрос? В вашем сообщении нет ни одного вопросительного знака. Что не получается? Пожалуйста, будьте более конкретными.   -  person hitzg    schedule 26.06.2015
comment
Ну разве столбец не называется '00:00:00' (а не '00:00')?!   -  person hitzg    schedule 26.06.2015
comment
Вы не можете сделать точечный график со строками в качестве координат.   -  person hitzg    schedule 26.06.2015
comment
@mwaskom - я вернул тег морского дна, потому что похоже, что тепловая карта морского дна может быть полезным решением. Пожалуйста, повторно удалите тег seaborn, если вы не хотите, чтобы он отображался там.   -  person JohnE    schedule 26.06.2015
comment
Решение @JohnE Seaborn хорошее .. пусть тег будет.   -  person    schedule 26.06.2015
comment
Спасибо :) Ценю информацию .. !   -  person    schedule 26.06.2015


Ответы (1)


Я надеялся, что это может сработать, просто изменив «Имя» и «Место» на категориальные, но не повезло (либо с сюжетом, либо с морским дном). В основном это будет работать, если вы преобразуете их в целые числа, но тогда вы потеряете метки, которые были бы у вас со строками или категориальными. ВНЕШНЯЯ ПОМОЩЬ:

df2 = df.copy()
for c in ['Place','Name']:
    df2[c] = df2[c].astype('category').cat.codes

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(df2['Place'],df2['Name'], s=df2['00:00:00'])

введите здесь описание изображения

Или, может быть, тепловая карта будет работать лучше? Кажется, он принимает категориальные обозначения, поэтому вы получаете маркировку бесплатно.

df3 = df.copy()
for c in ['Place','Name']:
    df3[c] = df3[c].astype('category')

sns.heatmap( df3.pivot_table( index='Place', columns='Name', values='00:00:00' ) )

введите здесь описание изображения

person JohnE    schedule 26.06.2015
comment
Вы просто спасаете жизнь :) Я тоже думал о тепловых картах. Можно ли иметь аннотации с count из 00:00:00? - person ; 26.06.2015
comment
annot=True, хотя форматируется как число с плавающей запятой, а не как целое число. Не уверен, что есть способ это изменить. Вы также можете просто распечатать сводную_таблицу. - person JohnE; 26.06.2015
comment
Почему я прошу вас о предложении: у нас есть 2-3 значения для каждого имени, т. е. ячейка может отображать все эти значения, но я пытаюсь получить сложение всех счетчиков, попадающих в эти ячейки имен. - person ; 26.06.2015
comment
ОК, я не уверен точно w.r.t. морской. Вы можете опубликовать дополнительный вопрос, специально посвященный этому. Вы определенно можете поместить несколько aggfuncs в сводную таблицу, я просто не уверен навскидку переводить все это в тепловую карту. - person JohnE; 26.06.2015
comment
fmt=d, как в stackoverflow.com/questions/31055302/ - person mwaskom; 26.06.2015
comment
@mwaskom Большое спасибо! - person ; 27.06.2015
comment
@JohnE При выполнении обеих вышеуказанных программ я получаю эту ошибку: File "heatmap_sns.py", line 11, in <module> df3[c] = df3[c].astype('category') File "/usr/lib/python2.7/dist-packages/pandas/core/generic.py", line 2018, in astype dtype, copy=copy, raise_on_error=raise_on_error) TypeError: data type "category" not understood - person ; 27.06.2015
comment
Категория @SitzBlogz — это несколько новая функция панд. Возможно, вам потребуется обновить вашу версию — возможно, до 0.16. - person JohnE; 27.06.2015
comment
Обновил Pandas до новой версии 0.16 и теперь еще одна ошибка. File "heatmap_sns.py", line 13, in <module> sns.heatmap(df3.pivot_table(index='Name', columns='Taluka', values='00:00:00', annot=True, fmt="d") ) TypeError: pivot_table() got an unexpected keyword argument 'annot' Перекрестная проверка с синтаксисом Seaborn из документа, и это правильно, но все же ошибка. - person ; 27.06.2015