Как исправить ошибку «X должно иметь 2 или меньше измерений» в pyplot из matplotlib с помощью функции .boxplot? - PullRequest
0 голосов
/ 12 февраля 2019

Я хочу создать одну фигуру с 2 коробочными диаграммами, используя pyplot из matplotlib в python.

Я работаю с набором данных iris, который обеспечивает длину лепестка для 150 цветов из трех типов: Setosa, Versicolor, Virginica.Я хочу создать один блокпост для длины лепестка Setosa и один блокпост для длины лепестка Versicolor, все на одной фигуре.

Я основал свой код на этом уроке: https://matplotlib.org/gallery/pyplots/boxplot_demo_pyplot.html#sphx-glr-gallery-pyplots-boxplot-demo-pyplot-py

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from matplotlib import pyplot as plt

# From the iris dataset I create a dataframe which contains only the features 
# of the flowers (sepal length, sepal width, petal length, petal width and the 
# flower type. 

data = load_iris()
X= data["data"]
y = data ["target"]
iris=pd.DataFrame(X)
iris["target"]=y
iris.columns=data['feature_names']+["target"]
iris["target"]=iris["target"].apply(lambda x:'Setosa' if x == 0 else 'Versicolor' if x == 1 else 'Virginica')

# I create my sub-dataframes which each contain the petal length of one type of flower 
ar1 = np.array(iris.loc[lambda iris: iris["target"] == "Setosa", ["petal width (cm)"]])
ar2 = np.array(iris.loc[lambda iris: iris["target"] == "Versicolor", ["petal width (cm)"]])

# This works: 
fig, ax = plt.subplots()
ax.boxplot(ar1)
plt.show()

# But this doesn't work:
data1 = [ar1, ar2] 
fig, ax = plt.subplots()
ax.boxplot(data1)
plt.show()

Я ожидаю фигуру с 2 боксплотами.Вместо этого я получаю ошибку: «ValueError: X должен иметь 2 или меньше измерений».Однако ar1 и ar2 имеют 2 размера, точно такие же, как показано в примере с matplotlib, упомянутом выше.

Большое спасибо за помощь,

1 Ответ

0 голосов
/ 12 февраля 2019

Проблема в том, что

ar1 = np.array(iris.loc[lambda iris: iris["target"] == "Setosa", ["petal width (cm)"]])

создает двумерный массив формы (50,1).Итак, что вы можете сделать, это сначала сгладить массив,

data1 = [ar1.flatten(), ar2.flatten()] 
fig, ax = plt.subplots()
ax.boxplot(data1)
...