我正在寻找可视化每个流派的音乐版本的颜色。
我正在使用下面的代码。但是,问题在于它没有在单独的行上显示按流派分组的颜色。似乎是将这些类型的颜色分配给第一行,而不是每行分组的相应类型。
结果是这样的;
genres_of_interest = ['dutch drill', 'dutch pop', 'dutch hip hop']
# Create a filtered DataFrame for the genres of interest
filtered_df = df[df['Genre'].isin(genres_of_interest)]
# Group the filtered DataFrame by 'Genre' and extract the unique colors from the 'Main_Colors' column
grouped = filtered_df.groupby('Genre')['Main_Colors'].apply(lambda x: list(set([color for sublist in x for color in sublist])))
# Set up the figure and axes
fig, ax = plt.subplots(figsize=(12, len(genres_of_interest)))
# Plot each genre's color matrix
for i, genre in enumerate(genres_of_interest):
colors = grouped.get(genre, [])
color_matrix = np.array(colors)
ax.imshow([color_matrix], aspect='auto')
ax.text(-0.05, i, genre, va='center', ha='right', fontsize=10)
# Remove the tick labels
ax.set_xticks([])
ax.set_yticks([])
# Set the plot title
plt.title('Colors by Genre')
# Show the plot
plt.show()
0 dutch pop Jaap Reesema spotify:album:3LCalQC4ZIayuqQSZuBAnJ
1 dutch pop Julia Zahra spotify:album:6ZWgGdrkRDkhgXcXEQbSUZ
2 dutch pop Bertolf spotify:album:1AVH0irCkKoElBzN8vhynT
3 dutch pop Glen Faria spotify:album:6gdAvpnRN6VPdknvgSNyID
4 dutch pop Jengi spotify:album:4nm8MRARxw1YRlVX8m2BBW
.. ... ... ...
136 dutch hip hop Steen spotify:album:2fAHea1XRZWhU25O4WZKAU
137 dutch hip hop Ajay spotify:album:6Rp0g7eWIDSIxIpxP8B8l0
138 dutch hip hop Kingsta spotify:album:7xdm2GmPdAjbq9gpRgcalC
139 dutch hip hop Mick Spek spotify:album:5HG7pw6Nnxm91hpZ7dLefK
140 dutch hip hop Jerrih spotify:album:16uxfTXWcaTpL9fz5uDzHt
Genre_Link Friday \
0 ?genre=dutch%20pop®ion=NL&date=20230414&hidedu... 20230414
1 ?genre=dutch%20pop®ion=NL&date=20230414&hidedu... 20230414
2 ?genre=dutch%20pop®ion=NL&date=20230414&hidedu... 20230414
3 ?genre=dutch%20pop®ion=NL&date=20230414&hidedu... 20230414
4 ?genre=dutch%20pop®ion=NL&date=20230414&hidedu... 20230414
.. ... ...
136 ?genre=dutch%20hip%20hop®ion=NL&date=20230421&... 20230421
137 ?genre=dutch%20hip%20hop®ion=NL&date=20230421&... 20230421
138 ?genre=dutch%20hip%20hop®ion=NL&date=20230421&... 20230421
139 ?genre=dutch%20hip%20hop®ion=NL&date=20230421&... 20230421
140 ?genre=dutch%20hip%20hop®ion=NL&date=20230421&... 20230421
numberoftracks Album_Image_URL \
0 1 http://i.scdn.co/image/ab67616d00001e0255ce734...
1 1 http://i.scdn.co/image/ab67616d00001e020a3c941...
2 1 http://i.scdn.co/image/ab67616d00001e02396be8a...
3 1 http://i.scdn.co/image/ab67616d00001e02747d4bb...
4 4 http://i.scdn.co/image/ab67616d00001e02b000906...
.. ... ...
136 7 http://i.scdn.co/image/ab67616d00001e02a3b237d...
137 1 http://i.scdn.co/image/ab67616d00001e02d240f30...
138 15 http://i.scdn.co/image/ab67616d00001e023b4acb2...
139 1 http://i.scdn.co/image/ab67616d00001e02194c537...
140 1 http://i.scdn.co/image/ab67616d00001e02cf59a38...
genre_rank country_rank artist_ID releases_per_genre \
0 70 6186 A5WxnXxSCyhDSyi6elhBZd4 15
1 137 60237 A57QuHq7IzyUgZsgl0g5fMI 15
2 141 119412 A6cs3EabebGIu559XRIpQty 15
3 169 52578 A0O0Hr8JCTPqXyPLdN6kzdC 15
4 213 3504 A4lgrPvofm0IT605L9OrOTN 15
.. ... ... ... ...
136 265 25864 A4sf0XtUsKwVtg6YK72Dx2C 45
137 268 139247 A6blOShkI4PDC0gqCk6PQoa 45
138 313 483137 A3n6Lxlc9bF0mQWss8U1Yx5 45
139 314 146827 A23mbvDIZJjSK4y4KhwlnHi 45
140 333 119043 A0eKtd8T6YEkhuD9He27Jns 45
Date Main_Colors
0 2023-04-14 [(52, 1, 0), (68, 2, 15), (153, 5, 66)]
1 2023-04-14 [(41, 102, 54), (94, 79, 70), (233, 229, 223)]
2 2023-04-14 [(12, 10, 9), (39, 34, 35), (92, 88, 90)]
3 2023-04-14 [(140, 98, 50), (235, 215, 196), (178, 159, 138)]
4 2023-04-14 [(33, 119, 78), (113, 33, 102), (101, 61, 96)]
.. ... ...
136 2023-04-21 [(13, 44, 14), (49, 122, 51), (30, 92, 20)]
137 2023-04-21 [(181, 155, 140), (116, 91, 76), (69, 73, 82)]
138 2023-04-21 [(51, 29, 13), (11, 20, 14), (146, 75, 37)]
139 2023-04-21 [(62, 34, 23), (155, 79, 35), (208, 143, 82)]
140 2023-04-21 [(239, 214, 195), (210, 163, 96), (146, 85, 53)]```
每个流派的颜色组数量必须相同,在这种情况下有 5.
在
python 3.11.2
、pandas 2.0.1
、matplotlib 3.7.1
中测试
import pandas as pd
import matplotlib.pyplot as plt
# dutch pop and dutch hip hop have the same number of color arrays
data = {'Genre': ['dutch pop', 'dutch pop', 'dutch pop', 'dutch pop', 'dutch pop',
'dutch hip hop', 'dutch hip hop', 'dutch hip hop', 'dutch hip hop', 'dutch hip hop'],
'Main_Colors': [[(52, 1, 0), (68, 2, 15), (153, 5, 66)],
[(41, 102, 54), (94, 79, 70), (233, 229, 223)],
[(12, 10, 9), (39, 34, 35), (92, 88, 90)],
[(140, 98, 50), (235, 215, 196), (178, 159, 138)],
[(33, 119, 78), (113, 33, 102), (101, 61, 96)],
[(13, 44, 14), (49, 122, 51), (30, 92, 20)],
[(181, 155, 140), (116, 91, 76), (69, 73, 82)],
[(51, 29, 13), (11, 20, 14), (146, 75, 37)],
[(62, 34, 23), (155, 79, 35), (208, 143, 82)],
[(239, 214, 195), (210, 163, 96), (146, 85, 53)]]}
df = pd.DataFrame(data)
# combine all the lists of tuples, use set to make sure the tuples are unique, and needs to be a list (not a set) to plot
groups = df.groupby('Genre')['Main_Colors'].sum().apply(set).apply(list)
fig, ax = plt.subplots(figsize=(12, len(groups)))
# plot all the data at once
ax.imshow(groups.tolist())
# add the labels
ax.set_yticks(range(len(groups)), groups.index.tolist())
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
# dutch pop has an extra color array compared to dutch hip hop
data = {'Genre': ['dutch pop', 'dutch pop', 'dutch pop', 'dutch pop', 'dutch pop', 'dutch pop',
'dutch hip hop', 'dutch hip hop', 'dutch hip hop', 'dutch hip hop', 'dutch hip hop'],
'Main_Colors': [[(52, 1, 0), (68, 2, 15), (153, 5, 66)],
[(52, 1, 200), (90, 10, 115), (153, 45, 166)],
[(41, 102, 54), (94, 79, 70), (233, 229, 223)],
[(12, 10, 9), (39, 34, 35), (92, 88, 90)],
[(140, 98, 50), (235, 215, 196), (178, 159, 138)],
[(33, 119, 78), (113, 33, 102), (101, 61, 96)],
[(13, 44, 14), (49, 122, 51), (30, 92, 20)],
[(181, 155, 140), (116, 91, 76), (69, 73, 82)],
[(51, 29, 13), (11, 20, 14), (146, 75, 37)],
[(62, 34, 23), (155, 79, 35), (208, 143, 82)],
[(239, 214, 195), (210, 163, 96), (146, 85, 53)]]}
df = pd.DataFrame(data)
# combine all the lists of tuples, use set to make sure the tuples are unique, and needs to be a list (not a set) to plot
groups = df.groupby('Genre')['Main_Colors'].sum().apply(set).apply(list)
fig, axes = plt.subplots(nrows=len(groups), ncols=1, figsize=(10, 1), sharex=True, gridspec_kw={'hspace': 0})
for group, label, ax in zip(groups, groups.index, axes):
ax.imshow([group])
ax.set_yticks([0], [label])