plotnine 在错误的地方显示离散值

plotnine shows discrete values in the wrong place

我正在尝试制作一个图形,每当列具有特定(离散)值时,在 x 轴上显示时间,在 y 轴上显示点。

下面是一些示例数据:

dat = pd.DataFrame({
    'time': [0, 15, 30],
    'A': [np.nan, np.nan, 'A'],
    'B': ['B', 'B', np.nan],
})

现在我试图在第 'A' 列显示字母 'A' 时在 'A' 列中显示一个点。我试过这个:

(gg.ggplot(dat, gg.aes('time', 'A'))
  + gg.geom_point()
  + gg.scale_y_discrete(name='', limits=list('A'))
)

但没有显示任何内容: link to figure

然后,我更改了绘图的 y 限制:

(gg.ggplot(dat, gg.aes('time'))
  + gg.geom_point(gg.aes(y='A'))
  + gg.scale_y_discrete(name='', limits=list('ABCD'))
)

现在,我想要的点出现了:第 'A' 列在时间 30 处显示值 'A',确实,那里有一个点。但非常奇怪的是,该图还在 'D' 列中显示了两个点: link to figure

我尝试了一些限制和列名,只要限制包含少于 4 个值,就根本不会显示任何点;在那之后,我想要的点出现了,但 NaN 值也被绘制在极限的最后一个字母的列中。

有人知道这里发生了什么吗?你能帮我做这个数字吗?

您需要做的第一件事是重塑数据框,以便堆叠变量和值,然后删除缺失值。

import pandas as pd
import numpy as np
from plotnine import *

df = pd.DataFrame({
    'time': [0, 15, 30],
    'A': [np.nan, np.nan, 'A'],
    'B': ['B', 'B', np.nan],
})

df = pd.melt(df, id_vars=['time'], value_vars=['A', 'B'])
df.dropna(inplace=True)

p = (ggplot(df, aes(x='time', y='value'))
  + theme_classic()
  + geom_point()
  + labs(y=None)
)