Это может быть вызвано тем, что я не понимаю, как работает pandas.melt
, но я получаю странное поведение при построении "расплавленных" фреймов данных с использованием plotnine .Оба кадра были преобразованы из широкого в длинный формат.Один кадр со столбцом, содержащим строковые значения (df_slow
), а другой - только с числовыми значениями (df_fast
).
Следующий код дает другое поведение.Построение df_slow
является медленным и дает странно выглядящую ось Y.Построение df_fast
выглядит нормально и быстро.Я предполагаю, что таяние панд делает что-то странное с данными, которые вызывают такое поведение.Смотрите примеры графиков.
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import plotnine as p9
SIZE = 200
value = np.random.rand(SIZE, 1)
# Create test data, one with a column containing strings, one with only numeric values
df_slow = pd.DataFrame({'value': value.flatten(), 'string_column': ['A']*SIZE})
df_fast = pd.DataFrame({'value': value.flatten()})
# Set index
df_slow = df_slow.reset_index()
df_fast = df_fast.reset_index()
# Convert 'df_slow', 'df_fast' to long format
df_slow = pd.melt(df_slow, id_vars='index')
df_fast = pd.melt(df_fast, id_vars='index')
print(df_slow.head())
print(df_fast.head())
df_slow = df_slow[df_slow.variable == 'value']
# This is slow and has many breaks on y-axis
p = (p9.ggplot(df_slow, p9.aes(x='index', y='value')) + p9.geom_point())
p.draw()
# This is much faster and y-axis looks good
p = (p9.ggplot(df_fast, p9.aes(x='index', y='value')) + p9.geom_point())
p.draw()
медленный и странный сюжет
быстрый и красивый сюжет
Возможное исправление
Изменение типа столбца «значение» в df_slow
приводит к тому, что при построении он ведет себя как df_fast
.
# This makes df_slow behave like df_fast when plotting
df_slow['value'] = df_slow.value.astype(np.float64)
Вопрос
Это ошибка в plotnine (или панд ) или я что-то не так делаю?
Ответ
При повороте двух столбцов с разными типами данных, в данном случае это строка и число с плавающей точкой, я думаю, этоимеет смысл, что результирующий столбец, содержащий как строки, так и числа с плавающей точкой, будет иметь тип объекта.Как указывал ALollz, это, вероятно, заставляет plotnine интерпретировать значения как строки, вызывающие такое поведение.