Как создать наложенную пузырьковую диаграмму в Python или Matlab?

Я пытаюсь создать пузырьковую карту в python. Мой набор данных выглядит так.

Year   (Total students)  (Number Passed)
-----------------------------------------
2011       (500)              (250)
2012       (350)              (150)
2013       (348)              (100)

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

отредактировано:

Фактический набор данных имеет 17 строк и 3 столбца.

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

Есть ли что-то, что я делаю неправильно?


person Steminist    schedule 11.12.2019    source источник
comment
В каком формате у вас есть этот набор данных? excel, csv, текст, кадр данных pandas, массив numpy?   -  person abhilb    schedule 11.12.2019
comment
Это то, что вы ищете? stackoverflow .com/questions/59266060/   -  person Diziet Asahi    schedule 11.12.2019
comment
@abhilb набор данных в формате csv   -  person Steminist    schedule 11.12.2019
comment
@DizieAsahi не совсем так. Пока мой набор данных с 3 годами, например, у меня будет 3 пузырьковых графика, наложенных друг на друга, где больший круг будет общим количеством студентов, а меньший круг, который будет наложен на больший, будет долей студентов кто прошел. И я хочу каждый год бок о бок на одном участке.   -  person Steminist    schedule 11.12.2019


Ответы (2)


Предполагая, что ваши данные находятся в DataFrame, вы можете сделать что-то вроде следующего:

from matplotlib import pyplot as plt
s = len(df.index)
plt.scatter(df["Year"], np.ones(s), s=df["Total Students"]*20, alpha=0.6)
plt.scatter(df["Year"], np.ones(s), s=df["Number Passed"]*20, alpha=0.4)

plt.yticks([])
plt.xticks(df["Year"])

plt.show()

Предоставление:

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

Но я не уверен, что это лучшая визуализация ваших данных или, действительно, то, о чем просит ваш вопрос.

person CDJB    schedule 11.12.2019
comment
ответил почти одновременно. Великий ум мыслит одинаково ;) +1 - person Diziet Asahi; 11.12.2019
comment
Спасибо. Хотя мой график по-прежнему показывает пустой прямоугольник. Прикрепил картинку к своему вопросу. Что я могу делать неправильно? - person Steminist; 11.12.2019
comment
Просто измените масштаб значений. В моем я умножил на 20 - в вашем вам, возможно, придется разделить. Строка для изменения: s=df["Total Students"]*20. - person CDJB; 11.12.2019
comment
@Steminist Глядя на размер ваших опубликованных данных, вам, вероятно, нужно сделать что-то вроде s=df["Total Students"]*1e-4 - person CDJB; 11.12.2019

d = """Year   Total      Passed
2011       9e6              4e6
2012       10e6              3e6
2013       11e6              2e6"""
df = pd.read_csv(StringIO(d), sep='\\s+', header=0)

scale = 1e-3
fig, ax = plt.subplots()
ax.scatter(df['Year'], [0]*len(df['Year']), s=scale*df['Total'], label='Total')
ax.scatter(df['Year'], [0]*len(df['Year']), s=scale*df['Passed'], label='Passed')
ax.set_xticks(df['Year'])
ax.set_xticklabels(df['Year'])
ax.margins(x=0.25)

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

person Diziet Asahi    schedule 11.12.2019
comment
Я не могу понять точный сюжет. @Дизиет Асахи. - person Steminist; 11.12.2019
comment
Ваш диапазон данных намного больше, чем в исходном вопросе. Вам нужно будет изменить масштаб ваших размеров, т. е. изменить значение scale в s=scale*df['Total_vacc'] до тех пор, пока у вас не будет соответствующего размера пузырьков. - person Diziet Asahi; 11.12.2019
comment
Изменение масштаба ничего не изменило для меня. Насколько большим он может быть? Что ты предлагаешь. - person Steminist; 11.12.2019
comment
Я отредактировал свой ответ, указав значения того же порядка, что и ваши. Мне пришлось использовать scale из 1e-3, чтобы получить пузыри приличного размера. - person Diziet Asahi; 11.12.2019