用pandas.plotting.parallel_coordinates表示非数字(位置)排名的问题

问题描述 投票:0回答:1

这个问题使我像无头鸡一样四处走动的时间超过了我想承认的时间。

我在数据框中具有以下格式的排名(这是一个汇总示例)

+---------+-------+-------+-------+-------+-------+--+
| ranking | Day 1 | Day 2 | Day 3 | Day 4 | Day 5 |  |
+---------+-------+-------+-------+-------+-------+--+
| 1       | adria | adria | marta | marta | adria |  |
+---------+-------+-------+-------+-------+-------+--+
| 2       | marta | marta | dani  | dani  | marta |  |
+---------+-------+-------+-------+-------+-------+--+
| 3       | dani  | dani  | adria | adria | dani  |  |
+---------+-------+-------+-------+-------+-------+--+
| 4       | abel  | abel  | abel  | abel  | abel  |  |
+---------+-------+-------+-------+-------+-------+--+
| 5       |       | joan  | joan  |       |       |  |
+---------+-------+-------+-------+-------+-------+--+

简而言之,有几名球员,他们的排名上升和下降。终于有一个玩家(Joan)只玩了两天,然后消失了。

第一个冲动是使用pandas.plotting.parallel_coordinates(https://pandas.pydata.org/docs/reference/api/pandas.plotting.parallel_coordinates.html

使用以下代码:

plt.figure(figsize = (20,5)) # Plot Width & Height
pd.plotting.parallel_coordinates(
  df, 'ranking',
  axvlines = False,
  marker='o', # Show marker
  markersize=12, #The Marker Size
  linewidth=6, # The Line Width
  alpha=0.9, # Opacity of lines
  )

plt.gca().invert_yaxis() # This inverts the Y aixs.
plt.legend('')
plt.style.use('fivethirtyeight') # This is the style
plt.show()

但是结果根本不是预期的:

链接到图像:link

请注意,我已经反转了Y轴以显示上面的位置#1

问题1:这些行不遵循表格的顺序。如您所见,玩家“ dani”从来没有排在第一位,但是在表示形式中,您会看到它在排名中上升了两个位置,排名第一。如果将表中的数据与可视化数据进行比较,您会发现其他玩家也会发生同样的事情。它们不遵循表格的位置。

问题2:我不知道如何表示。该行仅代表他打过的日子。

问题3:这是一个非常简单的可视化,但让我们想象一下,在过去的几天中,我们有数百名玩家。这会使颜色复杂化。我曾考虑过将播放器的名称作为标签放置在每条直线上,但我一直无法找到一种方法...

我的假设范围很广,从我毫无用处的简单事实[[(Ockham的剃须刀盛行),到无法用此库以此方式表示此数据。

我很想为此使用类似于Sankey Diagram的东西,但是我不认为这正是我所需要的,并且它使代码变得非常复杂。

如果能为我提供帮助,我将不胜感激,因为经过很多尝试,我确实达到了无法解决问题的地步。

欢迎提出任何想法。

谢谢!

python pandas matplotlib parallel-coordinates
1个回答
0
投票
我不知道如何在熊猫本身中执行此操作,但是如果您首先Altair您的DataFrame,则可以在melt中执行类似的操作:

melt

哪个可以让您:import altair as alt

alt.Chart(
    df.melt("ranking", var_name="day", value_name="player").dropna()
    , width=500
).mark_line(
    strokeWidth=5,
    opacity=0.5
).encode(
    alt.X('day:N', title=""),
    alt.Y('ranking:Q', scale=alt.Scale(domain=[1, 5], reverse=True)),
    color='player:N',
    tooltip='player:N',
)

或者您可以在图的每个点上添加文本,例如:

enter image description here

import altair as alt

base = alt.Chart(
    df.melt("ranking", var_name="day", value_name="player").dropna()
    , width=500
).encode(
    alt.X('day:N', title=""),
    alt.Y('ranking:Q', scale=alt.Scale(domain=[1, 5], reverse=True)),
)

base.mark_line(
    strokeWidth=5,
    opacity=0.5
).encode(
    color='player:N',
    tooltip='player:N',
) + base.mark_text(
    fontSize=16
).encode(
    text='player:N'
)
© www.soinside.com 2019 - 2024. All rights reserved.