<p>我就是这样做的。您需要使用<code>cat</code>列来控制不同的打印参数(颜色、样式、标记大小),然后创建映射对象(这里是dicts)来告诉每个类别使用哪个参数值。颜色很容易。linestyle比较困难,因为Seaborn只提供<code>dashes</code>作为一个可配置参数,它需要以<code>(segment, gap)</code>的高级Matplotlib格式给出。函数<a href="https://matplotlib.org/3.1.1/_modules/matplotlib/lines.html" rel="nofollow noreferrer">^{<cd4>}</a>将字符串值(例如<code> </code>)转换为此格式,但返回值需要小心处理。对于标记大小,不幸的是,<code>lineplot</code>不能随类别更改标记大小(即使您可以更改标记样式),因此您需要在顶部使用<code>scatterplot</code>。最后一位是图例,您可能希望在第二次绘图时禁用它,以避免重复,但问题是第一个图例中没有标记。如果这让您感到困扰,您仍然可以手动编辑图例。总而言之,它可能是这样的:</p>
<pre><code>import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
# Converts a line style to a format acceptable by Seaborn
def get_dash_pattern(style):
_, dash = mpl.lines._get_dash_pattern(style)
return dash if dash else (None, None)
data_tmp = pd.DataFrame({
'x': [0,14,28,42,56, 0,14,28,42,56],
'y': [0, 0.003, 0.006, 0.008, 0.001, 0*2, 0.003*2, 0.006*2, 0.008*2, 0.001*2],
'cat': ['A','A','A','A','A','B','B','B','B','B'],
'color': ['#B5D8F0','#B5D8F0','#B5D8F0','#B5D8F0','#B5D8F0',
'#247AB2','#247AB2','#247AB2','#247AB2','#247AB2'],
'point': [14,14,14,14,14,28,28,28,28,28],
'linestyles':['-','-','-','-','-',' ',' ',' ',' ',' ']})
# Extract plot features as dicts
feats = (data_tmp[['cat', 'color', 'linestyles', 'point']]
.set_index('cat').drop_duplicates().to_dict())
palette, dashes, sizes = feats['color'], feats['linestyles'], feats['point']
# Convert line styles to dashes
dashes = {k: get_dash_pattern(v) for k, v in dashes.items()}
# Lines
lines = sns.lineplot(x="x", y="y", hue="cat", style="cat", data=data_tmp,
palette=palette, dashes=dashes)
# Points
sns.scatterplot(x="x", y="y", hue="cat", size="cat", data=data_tmp,
palette=palette, sizes=sizes, legend=False)
# Fix legend
for t, l in zip(lines.legend().get_texts(), lines.legend().get_lines()):
l.set_marker('o')
l.set_markersize(sizes.get(l.get_label(), 0) / t.get_fontsize())
plt.show()
</code></pre>
<p>输出:</p>
<p><a href="https://i.stack.imgur.com/b19dN.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/b19dN.png" alt="Final plot"/></a></p>