Я пытаюсь использовать точечный график, чтобы представить популярность определенных потоковых сервисов в зависимости от пола.До сих пор я нашел решения, показывающие, как создать точечный график, где размер метки графика представляет частоту каждого выделения.Однако наш опрос дал гораздо больше женских ответов, чем мужских, и я бы хотел, чтобы размер метки на графике представлял частоту каждого выбора в процентах от общего выбора по этому полу.Например, скажем, у нас есть 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()