1

这可能是由于我不了解其工作原理,但在使用plotninepandas.melt绘制“融化”数据帧时出现奇怪的行为。两个帧都已从宽格式转换为长格式。一帧有一列包含字符串值 ( ),另一帧仅包含数值 ( )。df_slowdf_fast

以下代码给出了不同的行为。绘图df_slow速度很慢,并且 y 轴看起来很奇怪。绘图df_fast看起来不错而且速度很快。我的猜测是 pandas melt 对导致这种行为的数据做了一些奇怪的事情。请参阅示例图。

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(或pandas)中的错误还是我做错了什么?

回答

当旋转具有不同数据类型的两列时,在本例中为字符串和浮点数,我想包含字符串和浮点数的结果列将具有类型对象是有道理的。正如 ALollz 指出的那样,这可能会使 plotnine 将值解释为导致这种行为的字符串。

4

0 回答 0