Генерация точечной диаграммы в Matplotlib с отрицательной и положительной осями - PullRequest
0 голосов
/ 04 марта 2019

Я работаю над проектом, который строит клинические значения, используя 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 голосов
/ 04 марта 2019

Ваша проблема в том, что ваши 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

Править:

Вы можете увидеть причину, по которой он строит только 4 точки данных, когда вы вызываете plt.ylim(-3, 3), потому что у него нет числовых точек на оси Y, и поэтому он не имеет понятия об этом диапазоне.Поэтому он просто строит -3 -> 3 точки данных (т. Е. 0-ю, 1-ю, 2-ю и 3-ю точки данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...