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

Python xlabel和ylabel值未在matplotlib散点图中排序,python,matplotlib,scatter-plot,Python,Matplotlib,Scatter Plot,我在互联网上做了大量枯燥乏味的搜索,似乎我还没有弄清楚如何提出正确的问题,以获得我想做的事情的答案 我试图创建一个y轴上的市盈率和x轴上的股息率的散点图。我将数据放入一个CSV文件,然后将每个列作为单独的列表导入Python 下面是我的散点图。我不明白为什么x轴和y轴没有按数字排序。我认为我必须将列表中的元素转换为浮动,然后在将其转换为散点图之前进行某种排序 我能想到的另一个选择是在创建散点图的过程中能够对值进行排序 这两种方法都没有奏效,我已经走到了死胡同。任何帮助或指出正确的方向都将不胜感激

我在互联网上做了大量枯燥乏味的搜索,似乎我还没有弄清楚如何提出正确的问题,以获得我想做的事情的答案

我试图创建一个y轴上的市盈率和x轴上的股息率的散点图。我将数据放入一个CSV文件,然后将每个列作为单独的列表导入Python

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

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

这两种方法都没有奏效,我已经走到了死胡同。任何帮助或指出正确的方向都将不胜感激,因为我只能描述我的问题,但似乎无法在搜索中提出正确的问题

导入csv
将matplotlib.pyplot作为plt导入
etf_data=csv.reader(打开('xlv_xlu_combined_td.csv','r'))
对于i,etf_data.iterrows()中的行:
symbol.append(第[0]行)
index.append(第[1]行)
股息追加(第[2]行)
pe.追加(第[3]行)
symbol.pop(0)
index.pop(0)
股息.波普(0)
体育流行音乐(0)
索引=[i.split(“%”,1)[0]表示索引中的i]
股息收益率=[d.split('%,1)[0]代表股息中的d]
市盈率=[p.split('X',1)[0]表示市盈率中的p]
x=股息率\收益率[:5]
y=市盈率[:5]
plt.散射(x,y,标签='Healthcare P/E&Distribution',alpha=0.5)
plt.xlabel(“股息收益率”)
plt.ylabel(‘市盈率’)
plt.legend()
plt.show()

xlv\u xlu\u组合\u td.csv

符号、索引、股息、pe
JNJ,10.11%,2.81%,263.00倍
UNH,7.27%,1.40%,21.93倍
PFE,6.48%,3.62%,10.19倍
MRK,4.96%,3.06%,104.92倍
ABBV分别为4.43%、4.01%、23.86X
AMGN,3.86%,2.72%,60.93倍
MDT,3.50%,2.27%,38.10倍
ABT,3.26%,1.78%,231.74倍
吉尔德,2.95%,2.93%,28.69倍
BMY,2.72%,2.81%,97.81倍
TMO,2.55%,0.32%,36.98X
LLY分别为2.49%、2.53%、81.83倍
据我所知,它不会在绘图之前自动为您排序数据。如果需要排序的数据,首先必须执行以下操作

x.sort()
y.sort()
然后将它们存储在一个新变量中,然后将其放入散射函数中


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

您需要将字符串转换为数字。Matplotlib将字符串视为“类别”,并按您提供的顺序打印它们。

我没有足够的代表来回复OPs上的评论对Jody的评论的响应,但我想补充一点,这确实解决了我的问题,但如果您遇到的问题与我遇到的问题相同,您的数据帧中有多个类型,使用以下格式仅转换一列:

df[“colName”]=pd.to_numeric(df[“colName”])

希望这能帮助别人

  • 问题是这些值是
    string
    type,因此它们是按列表中给定的顺序绘制的,而不是按数字顺序
  • 值必须从末尾删除符号,然后转换为数字类型
使用
csv
模块添加到现有代码
  • 给定现有代码,将列表中的值转换为
    float
    类型将很容易
index=[i.split(“%”,1)[0]表示索引中的i]
股息收益率=[d.split('%,1)[0]代表股息中的d]
市盈率=[p.split('X',1)[0]表示市盈率中的p]
#从值中删除符号后,将映射值添加到浮点
索引=列表(映射(浮动,索引))
股息收益率=列表(map(浮动,股息收益率))
市盈率=列表(映射(浮动,市盈率))
#密谋
x=股息率\收益率[:5]
y=市盈率[:5]
plt.散射(x,y,标签='Healthcare P/E&Distribution',alpha=0.5)
plt.xlabel(“股息收益率”)
plt.ylabel(‘市盈率’)
plt.图例(bbox_to_anchor=(1,1),loc='左上角')
plt.show()
使用
pandas
  • 从带有
    col.str[:-1]
  • 使用
    .astype(float)
  • 使用熊猫1.2.4版和matplotlib 3.3.4版
  • 此选项将所需代码从23行减少到4行。
将熊猫作为pd导入
#读文件
df=pd.read\u csv('xlv\u xlu\u combined\u td.csv')
#删除数字末尾的符号,并将列设置为浮动类型
df.iloc[:,1:]=df.iloc[:,1:].apply(lambda col:col.str[:-1]).astype(float)
#绘制两列的前五行
ax=df.iloc[:5,2::]图(x='divident',y='pe',kind='scatter',alpha=0.5,
ylabel='股息收益率',xlabel='Pe比率',
标签=‘医疗保健P/E和股息’)
ax.图例(bbox_to_anchor=(1,1),loc='左上角')
绘制两种实现的输出
  • 请注意,这些数字现在已正确排序

(x[i],y[i])
x.sort()
y.sort()