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