这个问题使我像无头鸡一样四处走动的时间超过了我想承认的时间。
我在数据框中具有以下格式的排名(这是一个汇总示例)。
+---------+-------+-------+-------+-------+-------+--+
| 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的东西,但是我不认为这正是我所需要的,并且它使代码变得非常复杂。如果能为我提供帮助,我将不胜感激,因为经过很多尝试,我确实达到了无法解决问题的地步。
欢迎提出任何想法。
谢谢!
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', )
或者您可以在图的每个点上添加文本,例如:
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'
)