从Pandas DataFrame打印时控制颜色和图例,每个x有多个y值

2024-06-01 05:06:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有3列的数据帧。我想在x轴上绘制col1,在y轴上绘制col2和col3。Col1有重复的值,因此对于每个x值都有重复的y值。在

示例数据帧:

DF = pd.DataFrame({"name": ["Alice", "Alice", "Charles", "Charles", "Kumar", "Kumar"],
              "height": [124, 126, 169, 170, 175, 174],
              "weight": [100, 105, 123, 125, 139, 140]})

DF 

    name    height  weight
  0 Alice   124     100
  1 Alice   126     105
  2 Charles 169     123
  3 Charles 170     125
  4 Kumar   175     139
  5 Kumar   174     140

我想要:

A)每个人在x轴上只出现一次

B)保持所有高度为一种颜色,所有重量为另一种颜色,具有准确、不重复的图例

到目前为止,我只能得到A或B,而不是两者都有。下面是我正在尝试的内容和输出。对于A,这很有帮助(Python Scatter Plot with Multiple Y values for each X

对于A:

^{pr2}$

对于B:

ax = DF.plot(style="o", figsize=(7, 5), xlim=(-1, 6))
ax.set_xticks(DF.index)
ax.set_xticklabels(DF.name, rotation=90)
plt.show()

enter image description here

enter image description here


Tags: 数据namedf颜色绘制axcol2col3
2条回答

一个简单的选项是直接使用matplotlib打印,而不是使用熊猫.DataFrame.plot方法。为了使解决方案独立于列数和行数等,可以将“name”列设置为index。不需要在列上循环。因此,代码将是:

DF.set_index('name',inplace=True)
plt.plot(DF.index,DF.values,'o')
plt.legend(DF.columns)

从而产生:

plot1

另一种方法是调整选项B,将字符串值(不用于绘图,而是索引,这就是它们不在同一位置的原因)替换为整数值。

^{pr2}$

为了得到一个好的映射,在删除重复项后使用索引和名称之间的反向映射,对于ticks和ticklabels,也使用相同的值。

请注意,替换是在绘图之前执行的,并且它不会被存储,因此,DF不会被修改。

生成的绘图如下:

plot2

因为有2列,所以可以绘制2个散点图,每个散点图都有自己的标签。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({"name": ["Alice", "Alice", "Charles", "Charles", "Kumar", "Kumar"],
              "height": [124, 126, 169, 170, 175, 174],
              "weight": [100, 105, 123, 125, 139, 140]})

plt.scatter(df.name, df.height, label="height")
plt.scatter(df.name, df.weight, label="weight")
plt.legend()
plt.show()

enter image description here

有更多的列,你当然可以循环它们

^{pr2}$

相关问题 更多 >