Python maxplotlib - подзаголовок прямоугольной области + диаграмма рассеяния - PullRequest
1 голос
/ 12 июля 2020

Я пытаюсь выполнить диаграмму рассеяния внутри коробчатой ​​диаграммы как подзаговор. Когда я делаю только один ящик, это работает. Я могу определить точку c с указанием c цвета внутри поля. Зеленый шар (изображение 1) представляет собой конкретное число c по сравнению со значениями прямоугольной диаграммы.

  for columnName in data_num.columns:
    plt.figure(figsize=(2, 2), dpi=100)
    bp = data_num.boxplot(column=columnName, grid=False)
    y = S[columnName]
    x = columnName
    if y > data_num[columnName].describe().iloc[5]:
      plt.plot(1, y, 'r.', alpha=0.7,color='green',markersize=12)
      count_G = count_G + 1
    elif y < data_num[columnName].describe().iloc[5]:
      plt.plot(1, y, 'r.', alpha=0.7,color='red',markersize=12)
      count_L = count_L + 1
    else:
      plt.plot(1, y, 'r.', alpha=0.7,color='yellow',markersize=12)
      count_E = count_E + 1

Изображение 1 - точечная диаграмма + 1 прямоугольная диаграмма Я могу создать подзаговор с коробчатыми диаграммами.

  fig, axes = plt.subplots(6,10,figsize=(16,16)) # create figure and axes
  fig.subplots_adjust(hspace=0.6, wspace=1)

  for j,columnName in enumerate(list(data_num.columns.values)[:-1]):
    bp = data_num.boxplot(columnName,ax=axes.flatten()[j])

Изображение 2 - Подзаголовки + коробчатые диаграммы Но когда я пытаюсь построить конкретное c число внутри каждого коробчатого графика, на самом деле он подписывается на весь график.

plt.subplot(6,10,j+1)  
if y > data_num[columnName].describe().iloc[5]:
  plt.plot(1, y, 'r.', alpha=0.7,color='green',markersize=12)
  count_G = count_G + 1
elif y < data_num[columnName].describe().iloc[5]:
  plt.plot(1, y, 'r.', alpha=0.7,color='red',markersize=12)
  count_L = count_L + 1
else:
  plt.plot(1, y, 'r.', alpha=0.7,color='black',markersize=12)
  count_E = count_E + 1

Изображение 3 - Подзаголовки + разброс

1 Ответ

1 голос
/ 12 июля 2020

Не совсем понятно, что не так. Вероятно, звонок на plt.subplot(6,10,j+1) стирает что-то. Однако в таком вызове нет необходимости при стандартном современном использовании matplotlib, где подзаголовки создаются через fig, axes = plt.subplots(). Будьте осторожны, используйте ax.plot() вместо plt.plot(). plt.plot() графики на «текущей» оси, что может немного сбивать с толку, когда есть много подзаговоров.

В приведенном ниже примере кода сначала создаются некоторые игрушечные данные (надеюсь, похожие на данные в вопросе). Затем прямоугольные диаграммы и отдельные точки рисуются в al oop. Чтобы избежать повторения, счета и цвета хранятся в словарях. Поскольку data_num[columnName].describe().iloc[5] кажется медианой, для удобочитаемости код напрямую вычисляет эту медиану.

from matplotlib import pyplot as plt
import pandas as pd
import numpy as np

column_names = list('abcdef')
S = {c: np.random.randint(2, 6) for c in column_names}
data_num = pd.DataFrame({c: np.random.randint(np.random.randint(0, 3), np.random.randint(4, 8), 20)
                         for c in column_names})
colors = {'G': 'limegreen', 'E': 'gold', 'L': 'crimson'}
counts = {c: 0 for c in colors}

fig, axes = plt.subplots(1, 6, figsize=(12, 3), gridspec_kw={'hspace': 0.6, 'wspace': 1})
for columnName, ax in zip(data_num.columns, axes.flatten()):
    data_num.boxplot(column=columnName, grid=False, ax=ax)
    y = S[columnName]  # in case S would be a dataframe with one row: y = S[columnName].values[0]
    data_median = data_num[columnName].median()
    classification = 'G' if y > data_median else 'L' if y < data_median else 'E'
    ax.plot(1, y, '.', alpha=0.9, color=colors[classification], markersize=12)
    counts[classification] += 1
print(counts)
plt.show()

пример сюжета

...