Python 在Matplotlib中生成具有正负轴的散点图

Python 在Matplotlib中生成具有正负轴的散点图,python,pandas,numpy,matplotlib,Python,Pandas,Numpy,Matplotlib,我正在从事一个项目,该项目使用Matplotlib绘制临床值,并希望显示一个y轴,其负值和正值都在-3到3之间。我从数据框中获取数据 我试图绘制的数据示例如下: analyte_name = ['Uric Acid - Basic', 'Urea', 'Triglycerides - Basic', 'Sodium', 'Potassium - Basic', 'Glucose - Basic', 'Gamma Glutamytranferase - Basic', 'Creatinine -

我正在从事一个项目,该项目使用Matplotlib绘制临床值,并希望显示一个y轴,其负值和正值都在-3到3之间。我从数据框中获取数据

我试图绘制的数据示例如下:

analyte_name = ['Uric Acid - Basic', 'Urea', 'Triglycerides - Basic', 'Sodium', 'Potassium - Basic', 'Glucose - Basic', 'Gamma Glutamytranferase - Basic', 'Creatinine - Basic', 'Cholesterol Total - Basic', 'Cholesterol LDL - Basic', 'Cholesterol HDL - Basic', 'Chloride - Basic']
z_scores = ['-0.10', '-0.60', '-0.01', '-0.77', '-12.95', '-0.55', '-0.58', '-0.37', '-0.07', '0.19', '0.88', '0.69']
这就是我能想到的:

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import numpy as np

df = pd.DataFrame({'x_':analyte_names, 'y_':z_scores})
fig = plt.figure()
ax = fig.add_subplot(111)

ax.set_xlabel('analyte name')
ax.set_ylabel('z-score')

# plt.axhline(0, color='black')
plt.ylim(-3, 3)
plt.xticks(rotation=90)
plt.scatter('x_', 'y_' ,data=df, marker='o')
# plt.style.use('seaborn-dark')
plt.show()
但这给了我一个像这样的情节:

y轴从
z_分数[0]
开始按顺序绘制,但不显示所有
z_分数

注释掉
plt.ylim(-3,3)
行会给我一个这样的图像:

y轴从
z_分数[0]
开始按顺序绘制,并按顺序显示所有
z_分数

我使用的代码是从我之前尝试使用的代码修改而来的,该代码是:

df = pd.DataFrame({'x_':['A','B','C','D','E'], 
'y_':np.random.uniform(-3,3,5)})

fig = plt.figure()
ax = fig.add_subplot(111)

# ax.spines['top'].set_visible(False)
# ax.spines['right'].set_visible(False)

ax.set_xlabel('sample')
ax.set_ylabel('z-score')

plt.axhline(0, color='black')
plt.ylim(-3, 3)
plt.scatter('x_', 'y_' ,data=df, marker='o')
# plt.style.use('seaborn-dark')
plt.show()
该代码生成了我希望在进行一些轻微的样式设置之前最终输出的样子:

具有负值和正值的y轴

我一直在尝试使用不同的方法将数据传递到x轴和y轴,就像将数据作为字典传递一样,但结果是一样的

我还在学习如何绘制数据,希望能得到一些帮助


谢谢。

您的问题是因为您的
z分数
存储为字符串。Matplotlib显然并没有将它们解释为数字,而是将两个“分类变量”相对地绘制成一条直线。要解决此问题,请将
z分数
转换为浮动:

import numpy as np

# convert to numpy arrays
analyte_name = np.array(['Uric Acid - Basic', 'Urea', 'Triglycerides - Basic', 'Sodium', 'Potassium - Basic', 'Glucose - Basic', 'Gamma Glutamytranferase - Basic', 'Creatinine - Basic', 'Cholesterol Total - Basic', 'Cholesterol LDL - Basic', 'Cholesterol HDL - Basic', 'Chloride - Basic'])
z_scores = np.array(['-0.10', '-0.60', '-0.01', '-0.77', '-12.95', '-0.55', '-0.58', '-0.37', '-0.07', '0.19', '0.88', '0.69'])

# plot, converting your z-scores to floats
plt.plot(analyte_name, z_scores.astype(float))
这会解决你的问题

没有将它们转换为浮动,我得到了以下图像:

转换后,您可以看到正在正确绘制的内容:

编辑:


调用
plt.ylim(-3,3)
时,您可以看到它仅绘制4个数据点的原因,因为它在y轴上没有任何数字点,因此没有此范围的概念。因此,它只绘制-3-->3个数据点(即第0、第1、第2和第3个数据点)。

如果您尝试绘制
x=df['x_'].值
y=df['y']。值
?只是想知道如果错误被复制,您是否将数据作为原始numpy数组。编辑:看起来您的z分数存储为字符串-如果您将其更改为浮动会怎么样?谢谢您的帮助。这样一件小事让我绞尽脑汁好几个小时。我甚至没有想过检查z_分数的数据类型。没关系,这些都是经验造成的。我不想检查,直到我看到直线的数据,尽管-1295在中间!我想这是很重要的总是显式和存储变量,因为你期望!数字应该是整数或浮点数,以确保获得预期的行为。当然,除非你想要字符串行为…很好。从现在起我会记住这件事的。再次感谢。