Как построить сгруппированный столбчатый график с неравномерной длиной данных? - PullRequest
1 голос
/ 19 июня 2020

Я пытаюсь построить группы данных с разной длиной данных. Вы хоть представляете, как я могу визуализировать женский список, содержащий только два объекта, не заполняя остальные из них нулями, чтобы получить длину мужского списка?

Это код, который я получил до сих пор :

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

labels = ['G1', 'G2', 'G3', 'G4']
male = [1, 3, 10, 20]
female = [2, 7]

x = np.arange(len(labels))  # the label locations
width = 0.35  # the width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(x - width/2, male, width, label='male')
rects2 = ax.bar(x + width/2, female, width, label='female')

# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()

fig.tight_layout()
plt.show()

Ответы [ 3 ]

2 голосов
/ 19 июня 2020

Вы можете создать два разных массива для x-позиций:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

labels = ['G1', 'G2', 'G3', 'G4']
male = [1, 3, 10, 20]
female = [2, 7]

x_male = np.arange(len(male))
x_female = np.arange(len(female))

offset_male = np.zeros(len(male))
offset_female = np.zeros(len(female))

shorter = min(len(x_male), len(x_female))

width = 0.35  # the width of the bars

offset_male[:shorter] = width/2
offset_female[:shorter] = width/2

fig, ax = plt.subplots()
rects1 = ax.bar(x_male - offset_male, male, width, label='male')
rects2 = ax.bar(x_female + offset_female, female, width, label='female')

Тем не менее, это решение работает только тогда, когда значения отсутствуют в конце более короткого списка. Для значений, отсутствующих в списке, лучше использовать None или np.nan, как предлагает @ desert_ranger.

1 голос
/ 19 июня 2020

Если вы не хотите заполнять их нулями, вы можете присвоить им значения NAN -

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

labels = ['G1', 'G2', 'G3', 'G4']
male = [1, 3, 10, 20]
female = [2, 7,np.nan,np.nan]

x = np.arange(len(labels))  # the label locations
width = 0.35  # the width of the bars

fig, ax = plt.subplots()
ax.bar(x - width/2, male, width, label='male')
ax.bar(x + width/2, female, width, label='female')

# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()

fig.tight_layout()
plt.show()
0 голосов
/ 20 июня 2020

Используйте pandas

Вариант 1

  • Используйте itertools.zip_longest для архивирования списков неравной длины
import pandas as pd
import matplotlib.pyplot as plt
from itertools import zip_longest

# data
labels = ['G1', 'G2', 'G3', 'G4']
male = [1, 3, 10, 20]
female = [2, 7]

# zip lists together
data = list(zip_longest(male, female, labels))

# create dataframe from data
df = pd.DataFrame(data, columns=['male', 'female', 'labels'])

   male  female labels
0     1     2.0     G1
1     3     7.0     G2
2    10     NaN     G3
3    20     NaN     G4

# plot
p = df.plot.bar()

ticks, labels = plt.xticks()
xlabels = df.labels.tolist()
plt.xticks(ticks=ticks, labels=xlabels, rotation=0)

plt.show()

enter image description here

Option 2

import pandas as pd
import matplotlib.pyplot as plt

# data
labels = ['G1', 'G2', 'G3', 'G4']
male = [1, 3, 10, 20]
female = [2, 7]

# create a dataframe from the lists
df = pd.DataFrame([male, female], columns=labels, index=['male', 'female'])

        G1  G2    G3    G4
male     1   3  10.0  20.0
female   2   7   NaN   NaN

# plot
df.plot.bar()

введите описание изображения здесь

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