gpt4 book ai didi

python - Matplotlib 创建具有与系列对应的颜色的文本

转载 作者:太空宇宙 更新时间:2023-11-04 00:08:22 25 4
gpt4 key购买 nike

我正在尝试为不同的系列创建一个具有不同颜色的图。当我尝试将图中的数据添加为文本框时出现了问题。

我使用的代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import scipy.stats as stats

df = pd.DataFrame({'x': [21000, 16900, 18200, 32000, 35000, 7500], 'y':[3000, 2100, 1500, 3000, 2500, 2000], 'z':['a', 'b', 'c', 'd', 'e', 'f']})

fig, ax = plt.subplots(figsize=(8,6))

text_list = []
color_list = []

for i, row in df.iterrows():
mu, sigma, group = row['x'], row['y'], row['z']
x = np.linspace(mu - 4*sigma, mu + 4*sigma, 100)

sns.lineplot(x, stats.norm.pdf(x, mu, sigma), ax=ax)
color = ax.get_lines()[-1].get_c()

ax = plt.gca()
ax.text(mu*1.05, max(stats.norm.pdf(x, mu, sigma)), group, fontsize=16, color=color) #only retrieve RGB so blank text is not too light

text = r'{0}: {1} $\pm$ {2}'.format(group, mu, sigma)
text_list.append(text)
color_list.append(color)

plt.gcf().text(0.68, 0.6, '\n'.join(text_list), bbox=dict(facecolor='white', edgecolor='black', pad=10.0, alpha=1), fontsize=14)
fig.show()

生成以下图表: enter image description here

bbox 中的文本都是黑色的。理想情况下,文本框中的每一行都应具有与图中相应系列相同的颜色。

我能够在 text_box_content 和 color_list 中保存两个文本和颜色列表。我还尝试在具有动态更新文本位置的 for 循环中添加 plt.gcf().text(),但是为每一行创建边界框而不是为所有行创建一个整体边界框文本。

如果概念上有类似的东西就更好了

plt.gcf().text(zip(text_list, color_list)) 所以每一行都可以有自己的颜色?

最佳答案

您可以创建一个图例,并根据其所属线条的颜色为每个图例项着色。如果您不想在图例中显示线条本身,您可以将相应的字母显示为图例句柄。

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.legend_handler import HandlerBase
from matplotlib.text import Text
import seaborn as sns
import numpy as np
import scipy.stats as stats

class TextHandler(HandlerBase):
def create_artists(self, legend,tup ,xdescent, ydescent,
width, height, fontsize,trans):
tx = Text(width/2.,height/2,tup[0], fontsize=fontsize,
ha="center", va="center", color=tup[1], fontweight="bold")
return [tx]

df = pd.DataFrame({'x': [21000, 16900, 18200, 32000, 35000, 7500],
'y':[3000, 2100, 1500, 3000, 2500, 2000],
'z':['a', 'b', 'c', 'd', 'e', 'f']})

fig, ax = plt.subplots(figsize=(8,6))

handles = []
labels = []

for i, row in df.iterrows():
mu, sigma, group = row['x'], row['y'], row['z']
x = np.linspace(mu - 4*sigma, mu + 4*sigma, 100)

sns.lineplot(x, stats.norm.pdf(x, mu, sigma), ax=ax)
color = ax.get_lines()[-1].get_c()

ax.text(mu*1.05, max(stats.norm.pdf(x, mu, sigma)), group, fontsize=16, color=color)

handles.append(("{}:".format(group), color))
labels.append("{} $\pm$ {}".format(mu, sigma))

leg = ax.legend(handles=handles, labels=labels, handler_map={tuple : TextHandler()},
facecolor='white', edgecolor='black', borderpad=0.9, framealpha=1,
fontsize=10, handlelength=0.5)

for h, t in zip(leg.legendHandles, leg.get_texts()):
t.set_color(h.get_color())

plt.show()

enter image description here

这受到我对 this question 的回答中的代码的启发并部分使用了该代码,如果您不想使用图例,它还有一个替代方案。

关于python - Matplotlib 创建具有与系列对应的颜色的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53305557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com