【问题标题】:What is the most simple way to set scatterplot color based on category in python?在python中根据类别设置散点图颜色的最简单方法是什么?
【发布时间】:2021-06-06 09:01:36
【问题描述】:

我正在尝试以最简单的方式使用 python 为散点图中的点着色。 X 是一列,y 是另一列,最后一个(比如说 Z)有值(例如 A、B、C)。我想使用 Z 中的值对点 (X, Y) 着色。

我意识到过去有人问过一些类似的问题,但这对我来说并不奏效。可能是因为我不得不强制一切都是浮动的?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
import scipy.stats as stats

df = pd.read_csv(r"C:\......combinedsheet2.csv")

df['crowd1'] = pd.to_numeric(df['c1'], errors='coerce')
df['crowd3'] = pd.to_numeric(df['c3'], errors='coerce')
df['dist1'] = pd.to_numeric(df['d1'], errors='coerce')

我不确定为什么这些特定值被读取为浮点数以外的任何值——其他所有值都是,而且我没有使用此命令足以知道它是否会干扰任何未来的数据分析,并且可能是在尝试进行混合模型分析等时遇到了一些麻烦。

我使用的情节:

df.plot(x="c1", y="d1", c="black", kind="scatter")
ax = plt.gca()
ax.set_ylim([0, 610])
ax.set_xlim([0, 30])

为了将我的所有数据绘制在一起,我使用:

df.plot(x=["c1", "c2", "c3", "c4"], y=["d1", "d2", "d3", "d4"], c="black", kind="scatter")

ax = plt.gca()
ax.set_ylim([0, 450])
ax.set_xlim([0, 20])

这是我的 csv 文件内容,在某些情况下会减去几个小数点(前 3 行):

bwc c1 d1 dbz c2 d2 lmr c3 d3 tti c4 d4
A 12 67.00 F 20.0 454.2 I 4 405.4 L 14.0 137.9
B 8 122.0 G 20.0 265.0 J 3 490 M 0.0 144.9
A 0 217.0 F 15.0 235.0 I 0 62.80 N 11.0 418.7

我希望在每种情况下都能将每个不同的点(A、B、C 等)视为不同的颜色。谢谢!

【问题讨论】:

    标签: python pandas dataframe numpy matplotlib


    【解决方案1】:

    我建议使用seaborn package 来执行此操作。第一个图可以这样创建:

    sns.scatterplot(data=df, x='c1', y='d1', hue='bwc')
    

    将所有数据绘制在一起时,您首先需要重新调整数据框的形状,以便将 x、y 和色调变量放在单列中。有不止一种方法可以做到这一点。以下示例使用pd.wide_to_long,这需要重命名包含字母的列:

    import io
    import pandas as pd    # v 1.2.3
    import seaborn as sns  # v 0.11.1
    
    data = """
    bwc c1  d1  dbz c2  d2  lmr c3  d3  tti c4  d4
    A   12  67.00   F   20.0    454.2   I   4   405.4   L   14.0    137.9
    B   8   122.0   G   20.0    265.0   J   3   490 M   0.0 144.9
    A   0   217.0   F   15.0    235.0   I   0   62.80   N   11.0    418.7
    """
    df = pd.read_csv(io.StringIO(data), delim_whitespace=True)
    
    # Melt dataframe to have x, y and hue variables in single columns
    dfren = (df.rename(dict(bwc='let1', dbz='let2', lmr='let3', tti='let4'), axis=1)
               .reset_index())
    dfmelt = pd.wide_to_long(dfren, stubnames=['let', 'c', 'd'], i='index', j='j')
    
    # Plot scatter plot with seaborn
    ax = sns.scatterplot(data=dfmelt, x='c', y='d', hue='let')
    ax.figure.set_size_inches(8,6)
    ax.set_ylim([0, 450])
    ax.set_xlim([0, 20]);
    

    【讨论】:

      猜你喜欢
      • 2016-12-21
      • 2022-11-25
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 2021-03-11
      相关资源
      最近更新 更多