在Matplotlib中使用负轴和正轴生成散点图

时间:2019-03-04 07:03:59

标签: python pandas numpy matplotlib

我正在做一个使用Matplotlib绘制临床值的项目,并希望显示y轴,负值和正值的范围都从-3到3。我正在从DataFrame获取数据。

我要绘制的数据示例:

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_scores[0]开始依次绘制,但未显示所有z_scores

enter image description here

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

y轴从z_scores[0]开始依次绘制,并按顺序显示所有z_score

enter image description here

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

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轴的正值为负

enter image description here

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

我仍在学习如何绘制数据并希望获得帮助。

谢谢。

1 个答案:

答案 0 :(得分:2)

您的问题是因为您的z-scores存储为字符串。 Matplotlib显然不会将它们解释为数字,而只是将两个“类别变量”相互之间画一条直线。要解决此问题,请将z-scores转换为浮点数:

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))

这将解决您的问题!

没有将它们转换为浮点数,我得到了这张图片:

zscores_as_strings

转换后,您可以看到事物已正确绘制:

z_scores_as_float

编辑:

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