Как построить данные в виде матрицы 2х2 - PullRequest
0 голосов
/ 24 июня 2019

У меня есть короткая таблица, включающая три столбца, два текстовых столбца (столбец 1 и столбец 2) и один числовой столбец. Я хотел бы иметь матрицу / график рассеяния (x и y как столбец 1 и столбец 2) и размер маркера или цвет маркера как столбец три

Сначала я использовал команду MultiIndex для суммирования столбца 1 и столбца два, поскольку в этих столбцах у меня есть повторяющиеся значения. После применения этой команды у меня есть новый фрейм данных с двухуровневым индексом. Тем не менее, я могу подогнать для каждой комбинации индекса отдельный график (я использовал следующую ссылку в качестве справки Pandas Plotting with Multi-Index . Однако я хочу один отдельный график на оси x, скажем, level = 0, на уровне оси Y = 1 и размер маркера = столбец три

Table of data

    import pandas as pd
    data=pd.read_excel(path)
    new_frame=data.set_index(["Col 1", "Col 2"])
    new_frame.xs("High Humidity").plot(kind="bar")
    new_frame.xs("Low Humidity").plot(kind="bar")

С моим кодом я могу кодировать только графики для всех комбинаций. Но, как уже упоминалось, я хотел бы иметь график, где ось х, скажем, Col 1, ось Y Col 2 и размер маркера = col 3

Любые советы для меня:)

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

@ Зараки,

Мне кажется, я нашел работу, которая, по крайней мере, удовлетворяет мои потребности.Я добавил два дополнительных

columns, data["numerical Col 1"]=np.nan and data["numerical Col 2"]=np.nan

Затем я сделал цикл по кадру и создал, если условие

import pandas as pd
import sys
import matplotlib.pyplot as plt
import numpy as np
data=pd.read_excel(r"C:\Users\116225\Desktop\test_table.xlsx")
data["numerical Col 1"]=np.nan
data["numerical Col 2"]=np.nan
for i in range(len(data["Col 1"])):
    if data.at[i,"Col 1"]=="Low Humidity":
        data.at[i,"numerical Col 1"]=np.random.randint(0,20)
    else:
        data.at[i,"numerical Col 1"]=np.random.randint(21,41)

    if data.at[i,"Col 2"]=="Pulsmax":
        data.at[i,"numerical Col 2"]=np.random.randint(0,20)
    else:
        data.at[i,"numerical Col 2"]=np.random.randint(21,41)

new_frame=data.copy()

x1, y1 = [20, 20], [0, 45]
x2, y2 = [-1, 45], [20, 20]
plt.plot(x1,y1,x2,y2,c="red")
plt.scatter(x=new_frame["numerical Col 1"],y=new_frame["numerical Col    2"],s=new_frame["Col 3"]*1e-3)
plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off', labelright='off', labelbottom='off')

На скриншоте вы можете увидеть график рассеяния с двумя линиями, обозначающими границы:) enter image description here

0 голосов
/ 24 июня 2019

Вот простой пример, как это сделать:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'Col1':['HH','HH','LH','LH'],'Col2':['P','P','P','HT2'],'Col3':[15,20,4,5]})

# get data
x = df['Col1']
y = df['Col2']
marker_sizes = df['Col3']

# plot data
fig, ax = plt.subplots()
ax.scatter(x, y, marker='o', s=marker_sizes)
plt.show()

Вывод:

enter image description here

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