Диаграмма Пузырьковый график от pandas кросс-таблица - PullRequest
0 голосов
/ 25 февраля 2020

Как можно построить пузырьковую диаграмму из фрейма данных, созданного из кросс-таблицы pandas другого фрейма данных?

Imports;

import plotly as py
import plotly.graph_objects as go
from plotly.subplots import make_subplots

Кросс-таблица была создана с использованием;

df = pd.crosstab(raw_data['Speed'], raw_data['Height'].fillna('n/a'))

ДФ в основном содержит нули, однако, где появляется число, я хочу точку, где значение контролирует размер точки. Я хочу установить значения индекса в качестве оси x, а значения имен столбцов в качестве оси Y.

df будет выглядеть примерно так:

         10    20    30    40    50
1000     0     0    0      0     5
1100     0     0    0      7     0
1200     1     0    3      0     0
1300     0     0    0      0     0
1400     5     0    0      0     0

Я пробовал использовать scatter & Scatter, подобный этому;

fig.add_trace(go.Scatter(x=df.index.values, y=df.columns.values, size=df.values,
                         mode='lines'),
              row=1, col=3)

Возвращает объект TypeError: объект 'Module' не вызывается.

Любая помощь действительно приветствуется. Спасибо

ОБНОВЛЕНИЕ

Ответы ниже близки к тому, что я закончил, главное отличие в том, что я ссылаюсь на «Скорость» в линии расплава;

df.reset_index()
df.melt(id_vars="Speed")
df.rename(columns={"index":"Engine Speed",
                    "variable":"Height",
                    "value":"Count"})
df[df!=0].dropna()

scale=1000

fig.add_trace(go.Scatter(x=df["Speed"], y=df["Height"],mode='markers',marker_size=df["Count"]/scale),
              row=1, col=3)

Это работает, однако моя главная проблема сейчас в том, что набор данных огромен, и сюжет действительно пытается справиться с ним.

Обновление 2

Использование Scattergl позволяет Plotly очень хорошо справляться с большим набором данных!

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

В этом случае вы можете использовать plotly.express, это очень похоже на ответ @Erik, но не должно возвращать ошибки.

import pandas as pd
import plotly.express as px
from io import StringIO

txt = """
        10    20    30    40    50
1000     0     0    0      0     5
1100     0     0    0      7     0
1200     1     0    3      0     0
1300     0     0    0      0     0
1400     5     0    0      0     0
"""

df = pd.read_csv(StringIO(txt), delim_whitespace=True)

df = df.reset_index()\
       .melt(id_vars="index")\
       .rename(columns={"index":"Speed",
                        "variable":"Height",
                        "value":"Count"})

fig = px.scatter(df, x="Speed", y="Height",size="Count")
fig.show()

enter image description here

ОБНОВЛЕНИЕ В случае, если вы получили ошибку, проверьте pandas version с pd.__version__ и попробуйте проверить построчно это

df = pd.read_csv(StringIO(txt), delim_whitespace=True)

df = df.reset_index()

df = df.melt(id_vars="index")

df = df.rename(columns={"index":"Speed",
                        "variable":"Height",
                        "value":"Count"})

и сообщить в какой строке он ломается.

1 голос
/ 25 февраля 2020

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

  1. Каждая строка является наблюдением
  2. Каждый столбец является переменной
  3. Каждое значение должно иметь свою собственную ячейку

Чтобы создать более аккуратный фрейм данных, вы можете сделать

df = pd.crosstab(raw_data["Speed"], raw_data["Height"])
df.reset_index(level=0, inplace=True)
df.melt(id_vars=["Speed", "Height"], value_vars=["Counts"])
   Speed  Height  Counts
0   1000      10       2
1   1100      20       1
2   1200      10       1
3   1200      30       1
4   1300      40       1
5   1400      50       1

Следующим шагом будет фактическое построение графика.

# when scale is increased bubbles will become larger
scale = 10 
# create the scatter plot
scatter = go.Scatter(
    x=df.Speed, 
    y=df.Height,
    marker_size=df.counts*scale,
    mode='markers')
fig = go.Figure(scatter)
fig.show()

Это будет создайте сюжет, как показано ниже. bubble plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...