xlabel和ylabel值未在matplotlib散点图中排序

时间:2018-07-14 17:21:45

标签: python matplotlib scatter-plot

我已经在互联网上进行了大量繁琐的搜索工作,而且似乎还无法弄清楚如何提出正确的问题来获得我想做什么的答案。

我正在尝试创建一个散点图,其Y轴为 P / E比,x轴为股息收益率。我将数据放入CSV文件,然后将每一列作为单独的列表导入Python。

以下是我的散点图的结果。我很困惑为什么x和y轴没有按数字排序。我认为我必须将列表中的元素转换为浮点数,然后在将其转换为散点图之前进行某种

我能想到的另一个选择是能够在创建散点图的过程中对值进行排序。

这些都没有解决,我已经走到了尽头。我们将不胜感激,因为我只能描述我的问题,但似乎无法在搜索中提出正确的问题,因此将不胜感激。

scatterplot from matplotlib

4 个答案:

答案 0 :(得分:4)

您需要将字符串转换为数字。 Matplotlib将字符串视为“类别”,并按照您提供它们的顺序对其进行绘制...

答案 1 :(得分:2)

我没有足够的回复来回答关于OP对Jody的评论的评论,但我想补充一点,确实为我解决了该问题,但是如果您遇到的问题与我在哪里一样数据框中有多种类型,请使用以下格式仅转换一列:

df["colName"] = pd.to_numeric(df["colName"])

希望这对某人有帮助

答案 2 :(得分:2)

  • 问题在于值是 string 类型,因此它们按列表中给出的顺序绘制,而不是按数字顺序绘制。
  • 值必须从末尾删除符号,然后转换为数字类型。

使用 csv 模块添加到现有代码

  • 根据现有代码,很容易将列表中的值map() 转换为 float 类型。
indexes = [i.split('%', 1)[0] for i in index]
dividend_yield = [d.split('%', 1)[0] for d in dividend]
pe_ratio = [p.split('X', 1)[0] for p in pe]

# add mapping values to floats after removing the symbols from the values
indexes = list(map(float, indexes))
dividend_yield = list(map(float, dividend_yield))
pe_ratio = list(map(float, pe_ratio))

# plot
x = dividend_yield[:5]
y = pe_ratio[:5]

plt.scatter(x, y, label='Healthcare P/E & Dividend', alpha=0.5)
plt.xlabel('Dividend yield')
plt.ylabel('Pe ratio')
plt.legend(bbox_to_anchor=(1, 1), loc='upper left')
plt.show()

使用 pandas

  • 使用 col.str[:-1] 删除列中字符串末尾的符号
  • 使用 float 将列转换为 .astype(float) 类型
  • 使用 pandas v1.2.4matplotlib v3.3.4
  • 此选项将所需代码从 23 行减少到 4 行。
import pandas as pd

# read the file
df = pd.read_csv('xlv_xlu_combined_td.csv')

# remove the symbols from the end of the number and set the columns to float type
df.iloc[:, 1:] = df.iloc[:, 1:].apply(lambda col: col.str[:-1]).astype(float)

# plot the first five rows of the two columns
ax = df.iloc[:5, 2:].plot(x='dividend', y='pe', kind='scatter', alpha=0.5,
                          ylabel='Dividend yield', xlabel='Pe ratio',
                          label='Healthcare P/E & Dividend')
ax.legend(bbox_to_anchor=(1, 1), loc='upper left')

绘制两种实现的输出

  • 请注意,现在数字已正确排序。

enter image description here

答案 3 :(得分:-1)

import matplotlib.pyplot as plt

#arrays (X,Y) from your csv file with all of your data
x = [<some values>]
y = [<some values>]

plt.scatter(X,Y)

这将为您提供一个绘图,其中每个点的坐标为

(x[i],y[i])

据我所知,它不会在绘制之前自动为您排序数据。如果要对数据进行排序,则必须首先执行

之类的操作
x.sort()
y.sort()

,然后将它们存储在新变量中,然后将其放入分散函数中。

我看到的另一个问题是,在散点图中,X和Y轴标签不正确。我以前从未见过这种情况,也不确定为什么会这样。您可以提供一些代码来诊断为什么会发生这种情况吗?