python - 在图例上添加标签不起作用,使用 matplotlib
问题描述
我有以下数据框
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'var': ['bid', 'on', 'off', 'bid', 'on', 'off'],
'aud': ['H', 'H', 'H', 'L', 'L', 'L'],
'eff': [0.1, 0.2, 0.3, 0.01, 0.02, 0.03],
'spend': [10, 20, 30, 1, 2, 3],
'marg': [0.001, 0.002, 0.003, 0.0001, 0.0002, 0.0003]})
我的最终目标是创建一个气泡图,每个都有特定 color
的 s var
,在marg
上y_axis
,在eff
上 ,在 上x_axis
和size
气泡spend
与各自的传说相同color
和size
我正在使用以下代码
x = df.loc[df.aud == 'H']['eff']
y = df.loc[df.aud == 'H']['marg']
z = df.loc[df.aud == 'H']['spend']
colours_dict = dict(zip(['bid', 'on', 'off'], ['#185177', '#FAA22C', '#8FC5E8']))
g, ax = plt.subplots()
scatter = ax.scatter(x, y, c=[ colours_dict[i] for i in df.loc[df.aud == 'H']['var'] ], s=z*10)
# produce a legend with the unique colors from the scatter
legend1 = ax.legend(*scatter.legend_elements(),
loc="center", title="var")
ax.add_artist(legend1)
# produce a legend with a cross section of sizes from the scatter
handles, labels = scatter.legend_elements(prop="sizes", alpha=0.6)
legend2 = ax.legend(handles, labels, loc="upper right", title="Spend")
plt.savefig('bubbles.png')
问题是带有颜色的图例不显示标签。
有什么帮助吗?
解决方案
你有两个选择:
手动创建手柄
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'var': ['bid', 'on', 'off', 'bid', 'on', 'off'],
'aud': ['H', 'H', 'H', 'L', 'L', 'L'],
'eff': [0.1, 0.2, 0.3, 0.01, 0.02, 0.03],
'spend': [10, 20, 30, 1, 2, 3],
'marg': [0.001, 0.002, 0.003, 0.0001, 0.0002, 0.0003]})
x = df.loc[df.aud == 'H']['eff']
y = df.loc[df.aud == 'H']['marg']
z = df.loc[df.aud == 'H']['spend']
labels = ['bid', 'on', 'off']
colors = ['#185177', '#FAA22C', '#8FC5E8']
colours_dict = dict(zip(labels, colors))
fig, ax = plt.subplots()
c = [colours_dict[i] for i in df.loc[df.aud == 'H']['var']]
scatter = ax.scatter(x, y, c=c, s=z*10)
# produce a legend with the unique colors from the scatter
handles = [plt.Line2D([],[], ls="", marker="o", color=c) for c in colors]
legend1 = ax.legend(handles, labels, loc="lower right", title="var")
plt.show()
使用颜色映射
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap, BoundaryNorm
df = pd.DataFrame({'var': ['bid', 'on', 'off', 'bid', 'on', 'off'],
'aud': ['H', 'H', 'H', 'L', 'L', 'L'],
'eff': [0.1, 0.2, 0.3, 0.01, 0.02, 0.03],
'spend': [10, 20, 30, 1, 2, 3],
'marg': [0.001, 0.002, 0.003, 0.0001, 0.0002, 0.0003]})
x = df.loc[df.aud == 'H']['eff']
y = df.loc[df.aud == 'H']['marg']
z = df.loc[df.aud == 'H']['spend']
labels = ['bid', 'on', 'off',]
colors = ['#185177', '#FAA22C', '#8FC5E8']
inv = [labels.index(i) for i in df.loc[df.aud == 'H']['var']]
cmap = ListedColormap(colors)
norm = BoundaryNorm(np.arange(len(colors)+1)-0.5, len(colors))
fig, ax = plt.subplots()
scatter = ax.scatter(x, y, c=inv, s=z*10, cmap=cmap, norm=norm)
legend1 = ax.legend(scatter.legend_elements(num=len(labels))[0], labels,
loc="lower right", title="var")
plt.show()
推荐阅读
- javascript - 加载多个启动画面/超时加载屏幕反应本机博览会
- web - www 和非 www 域有不同的 SOP 吗?
- string - 在字符串匹配条件下无法终止 Ansible playbook
- javascript - 无法在浏览器中加载 WASM
- javascript - 使用 Java Script 对角线来回移动元素
- javascript - 如何将服务器中每个用户的 id 放入数组中?(Discord.js v12)
- php - 无法找到 [Laravel\Passport\Client] 的工厂
- python - 基于另一个 numpy 数组的 argmax 切片一个 numpy 数组
- phpstorm - 如何在 PhpStorm 中快速使用 USE 上课?
- c - 如何在数组中添加json对象?