【问题标题】:Convert a histogram plot from a Pandas dataframe to a scatter plot将 Pandas 数据框的直方图转换为散点图
【发布时间】:2021-10-22 13:44:47
【问题描述】:

我有一个直方图:

# Lets load a dataset of house prices in Boston. 
from sklearn.datasets import load_diabetes
#sklearn gives you the data as a dictionary, so 
diabetes = load_diabetes(as_frame=True)
data = diabetes['frame']
import matplotlib.pyplot as plt
%matplotlib inline
bmi_hist = plt.hist(data['bmi'], density=False)
bmi_hist = plt.ylabel("Frequency")
bmi_hist = plt.xlabel("Normalized BMI")
bp_hist = plt.hist(data['bp'], density=False)
bp_hist = plt.ylabel("Frequency")
bp_hist = plt.xlabel("Normalized BP")

这是上图中两列的直方图。 我想在散点图中比较这两者。我的尝试并不是很成功,因为我知道我需要一个 X 和一个 Y 来绘制。 我以为我会使用与直方图相同的轴:

y_bmi = data['bmi'].value_counts() # frequency
x_bmi = data['bmi'] # normalized value
ax1 = df.plot.scatter(x = x_bmi, y= y_bmi, c='DarkBlue')

但这只能在“数据帧”上使用,所以我必须将 bmi 列的值重复到新的数据帧中吗?还是有更简单的方法?

我们将不胜感激。 非常感谢。

【问题讨论】:

  • data[['bmi', 'bp']].plot(kind='hist', ec='k', alpha=0.5, figsize=(5, 4)) 是一个更容易实现直方图的方法。
  • 类似import seaborn as snssns.lmplot(data=data, x='bmi', y='bp', hue='sex') 是比较'bmi''bp' 之间关系的更好方法。

标签: python pandas matplotlib histogram scatter


【解决方案1】:
type(data['bmi'].value_counts())
# pandas.core.series.Series

如上所示,您需要将pandas Series 转换为DataFrame,如下所示:

from sklearn.datasets import load_diabetes
import matplotlib.pyplot as plt
import pandas as pd

%matplotlib inline

diabetes = load_diabetes(as_frame=True)
data = diabetes['frame']

pnd_srs = data['bmi'].value_counts()

df = pd.DataFrame({'normalized':pnd_srs.index, 'frequency':pnd_srs.values})

plt.scatter(x = df['normalized'] , y = df['frequency'] , c='DarkBlue')

plt.show()

输出:

编辑:根据您对评论的要求,如果您想按性别散布颜色变化,您可以试试这个:

import numpy as np
cdict = {'male': 'red', 'female': 'blue'}

fig, ax = plt.subplots()
for g in np.unique(data['sex']):
    sex = 'male' if g < 0 else 'female'
    ix = np.where(data['sex'] == g)
    ax.scatter(data['bmi'].iloc[ix].value_counts().index, 
               data['bmi'].iloc[ix].value_counts().values,
               c = cdict[sex], label = sex)
ax.legend()
plt.show()

输出:

【讨论】:

  • 非常感谢,这是否可以分开,例如,男性 bmi 和女性 bmi 也在同一个情节上?谢谢
  • @i_literally_hate_programming,是的,我们可以将男性绘制为红色,将女性绘制为蓝色,如何获得bmi男性和女性?
  • 是的,将 bmi 分散为单独的男性 bmi 和女性 bmi 点?
  • pnd_srs_bmi = (data['bmi'] = np.where(df['sex'] = -0.044642).value_counts() 这些值已标准化,因此不是 1 或 2,而是 -0.044
  • @i_literally_hate_programming,我编辑代码块和散点图
猜你喜欢
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 2014-04-24
  • 2020-01-19
相关资源
最近更新 更多