如何标准化数据并创建堆积条形图?
How can I normalize data and create a stacked bar chart?
我有一个数据框,其中包含 3 个地区每种游戏类型的总销售额。我想创建一个堆叠条形图,以便我可以比较每个地区每个类型的销售额。
我知道我应该先规范化数据,但不知道如何规范化。
我是编程的新手,所以如果有人能提供一个简单的解释说明我该如何去做,我将不胜感激!!
这是我的数据框
regional_genre = video_sales_df.groupby(['Genre'],as_index=False)["NA_Sales","EU_Sales","JP_Sales"].sum()[:5]
数据框:
Genre NA_Sales EU_Sales JP_Sales
Action 877,83 525 159,95
Adventure 105,8 64,13 52,07
Fighting 223,59 101,32 87,35
Misc 410,24 215,98 107,76
Platform 447,05 201,63 130,77
我使用了 [:5] 因为我只想绘制每个地区的前 5 个流派。
您可以使用 sklearn.preprocessing 函数 MinMaxScaler
通过将每个特征缩放到给定范围来转换特征。
这可能是您正在努力实现的目标。您可以使用 sklearn 进行标准化,并在下面查看如何创建堆积条形图。使用您想要的标准化比例。
import pandas as pd
from sklearn import preprocessing
import matplotlib.pyplot as plt
# Read data
video_sales_df = pd.read_excel("data.xlsx")
regional_genre = video_sales_df.groupby(['Genre'],as_index=False)["NA_Sales","EU_Sales","JP_Sales"].sum()[:5]
columns = ["NA_Sales","EU_Sales","JP_Sales"]
# Normalization parameters
normalize_min = 0.1
normalize_max = 1
# Normalize
regional_genre[columns]= preprocessing.minmax_scale(regional_genre[columns], feature_range=(normalize_min, normalize_max))
# Plot stacked bars
plt.bar(regional_genre["Genre"], regional_genre["NA_Sales"], label="NA_Sales")
plt.bar(regional_genre["Genre"], regional_genre["EU_Sales"], bottom=regional_genre["NA_Sales"], label="EU_Sales")
plt.bar(regional_genre["Genre"], regional_genre["JP_Sales"], bottom=regional_genre["EU_Sales"]+regional_genre["NA_Sales"], label="JP_Sales")
plt.legend()
plt.ylabel("Normalized sales")
plt.show()
另一个解决方案:
# Plot stacked bars
plt.bar(columns, regional_genre.ix[0,1:], label="Action")
bot = regional_genre.ix[0,1:]
plt.bar(columns, regional_genre.ix[1,1:], bottom=bot, label="Adventure")
bot += regional_genre.ix[1,1:]
plt.bar(columns, regional_genre.ix[2,1:], bottom=bot, label="Fighting")
bot += regional_genre.ix[2,1:]
plt.bar(columns, regional_genre.ix[3,1:], bottom=bot, label="Misc")
bot += regional_genre.ix[3,1:]
plt.bar(columns, regional_genre.ix[4,1:], bottom=bot, label="Platform")
plt.show()
我有一个数据框,其中包含 3 个地区每种游戏类型的总销售额。我想创建一个堆叠条形图,以便我可以比较每个地区每个类型的销售额。
我知道我应该先规范化数据,但不知道如何规范化。
我是编程的新手,所以如果有人能提供一个简单的解释说明我该如何去做,我将不胜感激!!
这是我的数据框
regional_genre = video_sales_df.groupby(['Genre'],as_index=False)["NA_Sales","EU_Sales","JP_Sales"].sum()[:5]
数据框:
Genre NA_Sales EU_Sales JP_Sales
Action 877,83 525 159,95
Adventure 105,8 64,13 52,07
Fighting 223,59 101,32 87,35
Misc 410,24 215,98 107,76
Platform 447,05 201,63 130,77
我使用了 [:5] 因为我只想绘制每个地区的前 5 个流派。
您可以使用 sklearn.preprocessing 函数 MinMaxScaler
通过将每个特征缩放到给定范围来转换特征。
这可能是您正在努力实现的目标。您可以使用 sklearn 进行标准化,并在下面查看如何创建堆积条形图。使用您想要的标准化比例。
import pandas as pd
from sklearn import preprocessing
import matplotlib.pyplot as plt
# Read data
video_sales_df = pd.read_excel("data.xlsx")
regional_genre = video_sales_df.groupby(['Genre'],as_index=False)["NA_Sales","EU_Sales","JP_Sales"].sum()[:5]
columns = ["NA_Sales","EU_Sales","JP_Sales"]
# Normalization parameters
normalize_min = 0.1
normalize_max = 1
# Normalize
regional_genre[columns]= preprocessing.minmax_scale(regional_genre[columns], feature_range=(normalize_min, normalize_max))
# Plot stacked bars
plt.bar(regional_genre["Genre"], regional_genre["NA_Sales"], label="NA_Sales")
plt.bar(regional_genre["Genre"], regional_genre["EU_Sales"], bottom=regional_genre["NA_Sales"], label="EU_Sales")
plt.bar(regional_genre["Genre"], regional_genre["JP_Sales"], bottom=regional_genre["EU_Sales"]+regional_genre["NA_Sales"], label="JP_Sales")
plt.legend()
plt.ylabel("Normalized sales")
plt.show()
另一个解决方案:
# Plot stacked bars
plt.bar(columns, regional_genre.ix[0,1:], label="Action")
bot = regional_genre.ix[0,1:]
plt.bar(columns, regional_genre.ix[1,1:], bottom=bot, label="Adventure")
bot += regional_genre.ix[1,1:]
plt.bar(columns, regional_genre.ix[2,1:], bottom=bot, label="Fighting")
bot += regional_genre.ix[2,1:]
plt.bar(columns, regional_genre.ix[3,1:], bottom=bot, label="Misc")
bot += regional_genre.ix[3,1:]
plt.bar(columns, regional_genre.ix[4,1:], bottom=bot, label="Platform")
plt.show()