当我用SeabornSwarmplot绘制数据时,它会将重叠的点按“中间向外”的顺序排列。这意味着,较大的水平位于中间,较小的水平位于边缘(如1,1,2,2,1,1
或2,2,3,4,2,2
)。这会使色调着色混乱,这可以通过获取我悬停在其上的点的索引并对其进行标记来确认我不确定的是,是我的标注方法不正确,还是Seaborn的色调搞砸了?我试过重新排序用于绘图的 Dataframe ,也试过设置hue_order
,但都没有正常工作。
以下是数据片段:
import pandas as pd
from io import StringIO
rejectionDF = StringIO('''
ID,Level,Days_After
472,3,3
678,2,3
491,3,10
621,3,10
314,4,11
575,3,11
654,3,11
356,3,12
403,3,12
301,2,12
557,2,12
405,3,13
694,3,13
770,3,13
361,2,13
452,2,13
484,2,13
750,2,13
371,3,14
458,3,14
474,3,14
483,3,14
705,3,14
418,2,14
481,2,14
583,2,14
729,2,14
797,2,14
818,2,14
254,3,15
392,3,15
475,3,15
684,3,15
737,3,15
805,3,15
370,2,15
444,2,15
498,2,15
521,2,15
542,2,15
577,2,15
603,2,15
733,2,15
739,2,15
809,2,15
680,4,16
368,3,16
387,3,16
513,3,16
659,3,16
''')
rejectionDF = pd.read_csv(rejectionDF)
下面是我使用的代码:
%matplotlib notebook # To show the hover in a Jupyter Notebook
import matplotlib.pyplot as plt
import seaborn as sns
import mplcursors
years = int(3)
timeframe = years*365 # 3 year time frame
# Unnecessary for the example, but I thought maybe sorting the data would work
rejection_timerange = rejectionDF[rejectionDF.Days_After <= timeframe].sort_values(by = ['Days_After', 'Level'], ascending = [True, False], ignore_index = True)
plt.rcParams["figure.figsize"] = (10,5)
plt.rcParams.update({'font.size': 10})
rej_fig, rej_ax = plt.subplots()
sns.set_palette(sns.color_palette(["orange", "orangered", "darkred"]))
rej_ax = sns.swarmplot(x = rejection_timerange.Days_After, y = [0]*len(rejection_timerange),
orient = "h", size=10, hue = rejection_timerange.Level, picker = 1)
@mplcursors.cursor(rej_ax, hover=2).connect("add")
def _(sel):
ID = rejection_timerange.ID[sel.index]
rejection_level = rejection_timerange.Level[sel.index]
color = rej_ax.collections[0].get_facecolors()[sel.index]
sel.annotation.set_text(('Study ID: {}\nDays after: {}\nRejection Level: {}').format(ID, int(sel.target[0]), rejection_level))
sel.annotation.get_bbox_patch().set(fc=color, alpha = 1)
sel.annotation.arrow_patch.set(arrowstyle="-|>", connectionstyle="angle3", fc="black", alpha=.5)
以下是一些标签或颜色不正确的点:
1条答案
按热度按时间jyztefdp1#
* 编辑(每个mwaskom)*
截至2022年9月和
Seaborn v0.12.0
,Swarm图不再重新排序图中的点,有效地使这成为一个非问题,我的上述代码(在问题中)可行。很显然(根据@JohanC的说法),群图在创建时会重新排列点的顺序,因此没有很好的方法来将 Dataframe 的顺序与群图的顺序相对应。我目前的最佳解决方案是将群图重新创建为matplotlib.plt散点图,创建一个自定义的
jitter
列,创建一个自定义的图例,并手动将正确的颜色应用到每个点。如果有更好的解决方案,请随时回答。