Как преобразовать эту гистограмму в точечный график/точечный график, используя matplotlib и numpy?

Я пытаюсь создать точечный график/точечный график на основе часов сна студентов, но самое близкое, что мне удалось получить, это гистограмма, которая соответствует моим данным. Метод, который я попробовал, который будет представлен ниже, не сработал для меня либо из-за моей явной неопытности, либо из-за несовместимости с моими данными. Любая помощь будет принята с благодарностью.

Я уже пробовал аналогичный ответ, который был таким: Как создать точечный график в Matplotlib? (не точечный график)

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

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

hours_of_sleep = [9, 6 ,8, 6, 8, 8, 6, 6.5, 6, 7, 9, 4, 3, 4, 5, 6, 11, 6, 3, 6, 6, 10, 7, 8, 4.5, 9, 7, 7]
bin_list = []

for number in hours_of_sleep:
    if number not in bin_list:
        bin_list.append(number)
        bin_list.sort()
        item_1 = bin_list[0]
        item_2 = bin_list[-1]


proper_bin = np.arange(item_1, item_2+1, 0.5)


plt.hist([hours_of_sleep], bins=proper_bin, rwidth= 0.8)
plt.title('Hours of Sleep for Students')

plt.show()

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


person Vedaant V    schedule 07.09.2019    source источник


Ответы (3)


Я бы предложил следующее, поскольку это просто:

from collections import Counter
import matplotlib.pyplot as plt

hours_of_sleep = [9, 6 ,8, 6, 8, 8, 6, 6.5, 6, 7, 9, 4, 3, 4, 5, 6, 11, 6, 3, 6, 6, 10, 7, 8, 4.5, 9, 7, 7]
z = Counter(hours_of_sleep)

ar = 0.2
fig, ax = plt.subplots(figsize=(plt.figaspect(ar)))
for key, value in z.items():
    X = [key] * value
    Y = [item + 1 for item in range(value)]
    plt.scatter(X, Y, color='b', s=100)

plt.xlabel('response')
plt.ylabel('occurrence')
plt.title('Dotplot-histogram')
plt.tight_layout()
plt.show()

Вот результат:

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

person Hoss    schedule 23.04.2020

Вы можете создать точечный график, перебирая массивы уникальных values и counts, возвращенных np.unique(hours_of_sleep, return_counts=True), чтобы нарисовать каждый столбец точек. Вот как вы можете создать график, аналогичный примеру, показанному в связанный вопрос:

import numpy as np                 # v 1.19.2
import matplotlib.pyplot as plt    # v 3.3.2

hours_of_sleep = [9, 6 ,8, 6, 8, 8, 6, 6.5, 6, 7, 9, 4, 3, 4, 5,
                  6, 11, 6, 3, 6, 6, 10, 7, 8, 4.5, 9, 7, 7]
values, counts = np.unique(hours_of_sleep, return_counts=True)

fig, ax = plt.subplots(figsize=(6, 3))
for value, count in zip(values, counts):
    ax.plot([value]*count, list(range(count)), c='tab:blue', marker='o',
            ms=10, linestyle='')
for spine in ['top', 'right', 'left']:
    ax.spines[spine].set_visible(False)
ax.yaxis.set_visible(False)
ax.set_ylim(-1, max(counts))
ax.set_xticks(range(int(min(values)), int(max(values)+1)))
ax.tick_params(axis='x', length=0, pad=8, labelsize=12)
ax.set_title('Hours of Sleep for Students', pad=30, fontsize=14)

plt.show()

dot_plot


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

person Patrick FitzGerald    schedule 02.02.2021

person    schedule
comment
Это очень помогло мне во всем разобраться, спасибо! - person Vedaant V; 07.09.2019