我想从Dataframe中制作一个散点图,其中每个点都以独特的颜色可视化,这取决于该值的发生频率。例如,我有以下数据框,包含两个数值的列表:
df = pd.DataFrame({'width': image_widths, 'height': image_heights})
df.head(10)
height width
0 1093 640
1 1136 639
2 1095 640
3 1136 639
4 1095 640
5 1100 640
6 1136 640
7 1136 639
8 1136 640
9 1031 640
现在,如您所见,一些价值对会多次出现。例如(1095/640)在索引2和4处出现。如何为该点提供表示“两次出现”的颜色。 如果从连续光谱中自动拾取颜色,就像在彩条图中一样,那就更好了。这样,色调已经给你一个频率的印象,而不是通过手动查找颜色代表它的颜色。
我也很欣赏色彩的另一种选择,即将出现的频率编码为点的半径。
修改
为了说明我的问题,我发现,df.groupby(['width','height']).size()
给了我所有组合的计数。
现在我缺乏将此信息与图中点的颜色(或大小)相关联的技能。
答案 0 :(得分:2)
因此,让我们将其设为真Minimal, Complete, and Verifiable example:
import matplotlib.pyplot as plt
import pandas as pd
image_heights = [1093, 1136, 1095, 1136, 1095, 1100, 1136, 1136, 1136, 1031]
image_widths = [640, 639, 640, 639, 640, 640, 640, 639, 640, 640]
df = pd.DataFrame({'width': image_widths, 'height': image_heights})
print(df)
width height
0 640 1093
1 639 1136
2 640 1095
3 639 1136
4 640 1095
5 640 1100
6 640 1136
7 639 1136
8 640 1136
9 640 1031
您希望DataFrame
中的尺寸(计数)以及宽度和高度:
plot_df = df.groupby(['width','height']).size().reset_index(name='count')
print(plot_df)
width height count
0 639 1136 3
1 640 1031 1
2 640 1093 1
3 640 1095 2
4 640 1100 1
5 640 1136 2
如果您使用DataFrame.plot.scatter
,则散点图中的颜色和尺寸由c
和s
关键字控制:
plot_df.plot.scatter(x='height', y='width', s=10 * plot_df['count']**2,
c='count', cmap='viridis')