gus*_*ago 4 python matplotlib pandas seaborn
我正在尝试使用 -package 组合散点图和线图seaborn(因为这似乎是跨类别使用颜色图的一种巧妙方法)。
目前,我有两个数据集存储为 pandas DataFrame:linear_data用于线性情况和scatter_data散点数据。我可以这样创建两个单独的图:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
# creating a nice color palette with 10 different colors
color_palette=sns.diverging_palette(10, 130, sep=100, n=10)
N=300
scatter_data = pd.DataFrame({'x' : np.random.random(N)*10, 'y' :
np.random.random(N)*100, 'score' : np.random.randint(1,10,N)})
# create linear plot for linear_data
lin_dict = {0.1: 51.98384470434041,
0.25: 69.9192341826548,
0.5: 83.48683256238559,
1.0: 97.05443094211638,
2.0: 110.62202932184718,
3.0: 118.5585655988348,
4.0: 124.18962770157796,
5.0: 128.55741880016157,
6.0: 132.1261639785656,
7.0: 135.1434950339544,
8.0: 137.75722608130874,
9.0: 140.06270025555324,
10.0: 142.12501717989235}
linear_data = pd.DataFrame.from_dict(lin_dict, orient='index').sort_index();
linear_data.index.name='x'; linear_data.columns = ['y']
ax = sns.pointplot(x=linear_data.index, y=linear_data['y'], data=linear_data)
# create scatter plot for scatter_data, having color scheme
# as in color_palette mapped onto the column 'score' (ranging from 1-10)
fg = sns.FacetGrid(data=scatter_data, hue='score', palette=color_palette, size=5, aspect=1.5)
fg.map(pyplot.scatter, 'x', 'y').add_legend()
Run Code Online (Sandbox Code Playgroud)
因此,我显然不想将这两个分开,而是希望将它们放在同一个情节中!我找不到FacetGrid需要任何ax变量,所以不太确定如何连接两者......
新:正如评论中提到的,我希望这些点位于linear_data较低的散点图中,但用线互连这些点(并且显然与散点图中使用的颜色不同,例如黑色)
有解决这个问题的线索吗?
您可以使用通常的方法plt.plot将“线性数据”绘制到与“分散数据”相同的轴上。
fg = sns.FacetGrid(data=scatter_data, hue='score',
palette=color_palette, size=5, aspect=1.5)
fg.map(plt.scatter, 'x', 'y').add_legend()
fg.axes[0,0].plot(linear_data.index, linear_data['y'], marker="o")
plt.show()
Run Code Online (Sandbox Code Playgroud)
无需显式使用 FacetGrid 即可实现相同的效果,而是使用 FacetGrid lmplot。
fg = sns.lmplot(x = 'x',y= 'y', data=scatter_data, hue='score',
palette=color_palette,fit_reg=False )
fg.axes[0,0].plot(linear_data.index, linear_data['y'], marker="o")
plt.show()
Run Code Online (Sandbox Code Playgroud)
最后,您甚至根本不需要任何 seaborn 绘图,而只需要一个 matplotlibscatter和一个 matplotlib plot。(这样做的唯一缺点是添加图例需要更多工作。)
color_palette=sns.diverging_palette(10, 130, sep=100, n=10, as_cmap=True)
plt.scatter(scatter_data.x, scatter_data.y, c=scatter_data.score, cmap=color_palette)
plt.plot(linear_data.index, linear_data['y'], marker="o")
plt.show()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9934 次 |
| 最近记录: |