数据可视化实战(3)

#任务要求

使用“豆瓣电影数据.xlsx”数据,完成以下任务:

1、制作电影产地与平均评分的树形图(以此命名),颜色选择红蓝发散,显示出平均评分标签,通过动态筛选器剔除掉电影数量小于200的国家数据

2、制作不同类型电影数量的气泡图,以不同颜色表示不同的电影类型,以电影数量表示气泡大小。

#电影产地与平均评分树形图

#matplotlib

1
2
3
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
1
2
df = pd.read_excel('data/豆瓣电影数据.xlsx', index_col=0)
df
1
2
3
4
# 获取所需数据
data = pd.merge(pd.DataFrame(df.value_counts('产地'), columns=['电影数量']), \
                pd.DataFrame(df.groupby('产地').mean()['评分']), on='产地')
data
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import squarify
# https://github.com/laserson/squarify#Documentation-for-Squarify
import matplotlib.cm as cm
from matplotlib.colors import Normalize

cmap = cm.RdBu
norm = Normalize(vmin=data['评分'].min(), vmax=data['评分'].max())

#中文及负号处理
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# data
labels = data.index
num = data['电影数量']
colors = cmap(norm(data['评分']))
        
# plot
fig = plt.figure(figsize = (12,6))
ax = fig.add_subplot(111)
plot = squarify.plot(sizes = num, # 方块面积大小
                     label = labels, # 指定标签
                     color = colors, # 指定自定义颜色
                     alpha = 0.7, # 指定透明度
                     value = num, # 添加数值标签
                     edgecolor = 'white', # 设置边界框
                     linewidth =0.1 # 设置边框宽度
                    )
# color bar
img = plt.imshow([df['评分']], cmap=cmap, aspect='auto') # auto解决比例失调
img.set_visible(False)
fig.colorbar(img, orientation="vertical", shrink=1)

# 设置标签大小
plt.rc('font', size=10)
# 设置标题大小
ax.set_title('电影产地与平均评分树形图', pad=20, fontsize = 22)
# 去除坐标轴
ax.axis('off')
# 去除上边框和右边框刻度
ax.tick_params(top = 'off', right = 'off')
plt.savefig('img/hw31.png')
# 显示图形
plt.show()

hw31

#不同类型电影数量气泡图

#matplotlib

1
2
3
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
1
2
df = pd.read_excel('data/豆瓣电影数据.xlsx', index_col=0)
df

获取各类型电影的数量。

1
2
data = df.value_counts('类型')
data
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
fig = plt.figure(dpi=150)
ax = fig.add_subplot(111)
colors = ['#F0F8FF','#FAEBD7','#00FFFF','#7FFFD4',\
          '#F0FFFF','#F5F5DC','#FFE4C4','#000000',\
          '#FFEBCD','#0000FF','#8A2BE2','#A52A2A',\
          '#DEB887','#5F9EA0','#7FFF00','#D2691E',\
          '#FF7F50','#6495ED','#FFF8DC','#DC143C',\
          '#00FFFF','#00008B','#008B8B','#B8860B',\
          '#A9A9A9','#006400','#BDB76B','#8B008B',\
          '#556B2F','#FF8C00','#9932CC',
]
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

x = np.random.rand(len(data))
y = np.random.rand(len(data))

# c对应colormap,color对应单个颜色
for i in range(len(data)):
    plt.scatter(x[i], y[i], s=np.sqrt(data.values[i]*100), color=colors[i], label=data.index[i])
# plt.scatter(x, y, s=np.sqrt(data.values*100),c=colors)
plt.title('不同类型电影数量气泡图', pad=15)
# ax.axis('off')
ax.set_xticks([]) 
ax.set_yticks([]) 
plt.legend(bbox_to_anchor=(1.1, 1.05), frameon=False, ncol=2)
plt.savefig('img/hw32.png', bbox_inches='tight')

hw32