【问题标题】:Generating a scatter plot in Matplotlib with negative and positive axes在 Matplotlib 中生成带有负轴和正轴的散点图
【发布时间】:2019-07-25 11:07:25
【问题描述】:

我正在做一个项目,该项目使用 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

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

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

我使用的代码是根据我之前尝试使用的代码修改的:

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 轴,就像将其作为字典传递一样,但结果是相同的。

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

谢谢。

【问题讨论】:

  • 如果您尝试绘制x = df['x_'].valuesy = df['y'].values 会怎样?只是想知道如果重现错误,您是否将数据作为原始 numpy 数组。 编辑:看起来您的 z 分数存储为字符串 - 如果您将这些更改为浮点数怎么办?

标签: python pandas numpy matplotlib


【解决方案1】:

您的问题是因为您的 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))

这将解决您的问题!

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

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

编辑:

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

【讨论】:

  • 感谢您的帮助。这么小的事情让我绞尽脑汁好几个小时。我什至没有想过检查 z_scores 的数据类型。
  • 没关系,这些东西都是有经验的。尽管中间有-12.95,但我直到看到直线数据才想到检查!我想始终保持显式并按照您的期望存储变量很重要!数字应该是整数或浮点数,以确保您获得预期的行为。除非你当然想要字符串行为......
  • 不错。从今以后我会记住这件事。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 2023-03-14
  • 2014-09-18
  • 2018-07-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多