Как использовать размер точечной диаграммы для представления частоты значений x, y в процентах от общего количества каждого значения x? - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь использовать точечный график, чтобы представить популярность определенных потоковых сервисов в зависимости от пола.До сих пор я нашел решения, показывающие, как создать точечный график, где размер метки графика представляет частоту каждого выделения.Однако наш опрос дал гораздо больше женских ответов, чем мужских, и я бы хотел, чтобы размер метки на графике представлял частоту каждого выбора в процентах от общего выбора по этому полу.Например, скажем, у нас есть 60 мужских ответов и 120 женских ответов, и 30 мужчин и 60 женщин выбрали «Netflix» в качестве своего любимого сервиса.Даже при том, что 50% каждого пола выбрали «Netflix» в качестве своего фаворита, отметка сюжета для выбора женщин будет намного больше. Мне бы хотелось, чтобы размер отметки сюжета представлял число мужчин (30) или женщин (60), который выбрал «Netflix» в процентах от общего числа мужчин (60) или женщин (120).

Я пытался манипулировать выражением, используемым в функции plot.scatter (), несколькими способами, но я не могу 'Похоже, что он работает так, как я хочу. Я включил свой код ниже. Я могу предоставить файл .csv, если он необходим. Спасибо.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plot
from collections import Counter

pd.option_context('display.max_rows', None, 'display.max_columns', None)
surveyData = pd.read_csv('Survey.csv')



# Rename columns and remove Timestamp column
surveyData.rename(columns={ 'How old are you?' : 'AGE',
                            'What is your gender?(Optional)' : 'GEN',
                            'Which devices do you use for streaming video? (Select all that apply)' : 'VD',
                            'Which video streaming services do you use? (Select all that apply)' : 'VS',
                            'If you chose more than one video streaming service, please select the one that is your favorite. (choose only one)' : 'FVS',
                            'On average, how many hours a day do you stream video? (Enter whole number)' : 'VH',
                            'Which do you prefer - Video Streaming Services or Cable Providers?' : 'VP',
                            'What would be the main reason for this? (optional)' : 'VR',
                            'Which devices do you use for streaming music? (Select all that apply)' : 'MD',
                            'Which music streaming services do you use? (Select all that apply)' : 'MS',
                            'If you chose more than one music streaming service, please select the one that is your favorite. (choose only one)' : 'MF',
                            'On average, how many hours a day do you stream music? (Enter whole number)' : 'MH',
                            'Which format do you prefer - streaming music, radio, or physical copies?           ' : 'MP',
                            'What would be the main reason for this? (optional).1' : 'MR'
                            },inplace=True)
surveyData.drop(['Timestamp'], axis=1, inplace=True)

#convert stings within each column to numerical values for plotting
surveyData = surveyData.fillna('None')
gender = {'Female': 0, 'Male': 1, "None": 2}
svcs = {    'Netflix': 1, 'DirecTV Now': 2, 'Amazon Prime Video': 3, 'Sling TV': 4,
            'YouTube': 5, 'fuboTV': 6, 'PlayStation Vue': 7, 'Hulu': 8, 'YouTube TV': 9,
            'Twitch': 10, 'None': 13, 'Google Play Movies & TV': 11, 'HBO': 12}

surveyData["GEN"] = [gender[item] for item in surveyData["GEN"]]
surveyData["FVS"] = [svcs[item] for item in surveyData["FVS"]] 


#PLOT DATA
#Use Counter to set transformation of plot size relative to frequency of choice
x = surveyData['GEN']
y = surveyData['FVS']
c = Counter(zip(x, y))
s = [20*c[(xx,yy)] for xx,yy in zip(x,y)]

#plot with formatting
xticks = ['', 'Netflix', 'DirecTV Now', 'Amazon Prime Video', 'Sling TV', 'YouTube', 'fuboTV', 'PlayStation Vue',
            'Hulu', 'YouTube TV', 'Twitch', 'GooglePlay Movies & TV', 'HBO', 'None']

surveyData.plot.scatter('FVS', 'GEN', s=s, c='blue')
yticks = ['Female', 'Male', 'Prefer Not To Say']
plot.xticks(np.arange(14), xticks, rotation=-90)
plot.yticks(np.arange(3), yticks)
plot.xlabel('Favorite Streaming Services')
plot.ylabel('Gender')
plot.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...