De nos jours, la plupart des calculs sont effectués en Python à la fois pour les loisirs et le travail, et le graphique est également fait en Python matplotlib. J'utiliserai des couleurs pour le graphique afin d'améliorer le caractère distinctif, mais je voulais garder la liste des couleurs de matplotlib à portée de main, j'ai donc créé une image de la liste des couleurs.
Obtenez une liste de couleurs pouvant être gérées par matplotlib en vous référant à ce qui suit. Vous pouvez obtenir des noms de couleurs et des valeurs hexadécimales au format dictionnaire.
Noms et listes de couleurs pouvant être spécifiées avec matplotlib
Tout ce que vous avez à faire maintenant est de remplir la zone rectangulaire spécifiée avec
fill```.
Cependant, afin de spécifier la couleur en faisant référence à cela lors de la création d'un graphique, je souhaite afficher le nom de la couleur et la valeur hexadécimale sous forme de texte. Le problème est le nom de la couleur et la couleur d'affichage du texte hexadécimal. Vous pouvez les spécifier un par un, mais j'ai décidé d'utiliser la valeur HSV car je pourrais d'une manière ou d'une autre spécifier la couleur d'affichage automatiquement.
Dans mon cas, l'hexadécimal est utilisé pour spécifier la couleur d'affichage, mais afin de déterminer la couleur d'affichage du texte, la couleur de la bande hexadécimale est une fois convertie en RVB, puis convertie en HSV, et le texte est affiché en fonction de cette valeur. J'ai essayé de décider de la couleur.
La fonction (def penc ()) qui détermine la couleur d'affichage du texte est la suivante. colorsys.rgb_to_hsv, Je l'utilise donc pour la conversion de RVB en HSV.
def penc(hval):
r=int(hval[1:3],16)
g=int(hval[3:5],16)
b=int(hval[6:8],16)
hsv=colorsys.rgb_to_hsv(r/255, g/255, b/255)
h=hsv[0]
s=hsv[1]
v=hsv[2]
col='#000000'
if 0.5<h: col='#ffffff'
if v<0.75: col='#ffffff'
return col
Dans l'exemple ci-dessus, la couleur d'affichage du texte est d'abord spécifiée comme noir (# 000000), mais si le HSV H dépasse 0,5 et la valeur V est inférieure à 0,75, la couleur d'affichage du texte est le blanc (#ffffff). J'essaye de le faire. J'ai pensé à utiliser la couleur opposée, mais j'étais réticent à rendre la couleur d'affichage du texte colorée, j'ai donc décidé de diviser la couleur d'affichage uniquement par le noir et blanc.
import matplotlib
import colorsys
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.family'] = 'Ricty Diminished'
def penc(hval):
#https://docs.python.org/ja/3/library/colorsys.html
r=int(hval[1:3],16)
g=int(hval[3:5],16)
b=int(hval[6:8],16)
hsv=colorsys.rgb_to_hsv(r/255, g/255, b/255)
h=hsv[0]
s=hsv[1]
v=hsv[2]
col='#000000'
if 0.5<h: col='#ffffff'
if v<0.75: col='#ffffff'
return col
cdic=matplotlib.colors.cnames
lkey=[]
lval=[]
for key, val in zip(cdic.keys(), cdic.values()):
lkey=lkey+[key]
lval=lval+[val]
xmin=0
xmax=4
k=-1
fnameF='fig_col_mpl.png'
ymin=0
ymax=37
plt.figure(figsize=(6,12))
plt.xlim([xmin,xmax])
plt.ylim([ymax,ymin])
plt.axis('off')
fsize=8 # fontsize
k=-1
for i in range(int(ymin),int(ymax)):
for j in range(0,4):
k=k+1
if k<len(lval):
xs=float(j)
xe=xs+1.0
ys=float(i)
ye=ys+1.0
xx=[xs,xe,xe,xs]
yy=[ys,ys,ye,ye]
plt.fill(xx,yy,color=lval[k])
text1=lkey[k]
text2=lval[k]
xg=0.5*(xs+xe)
yg=0.5*(ys+ye)
col=penc(lval[k])
plt.text(xg,yg-0.25,text1,rotation=0,ha='center',va='center',fontsize=fsize,color=col)
plt.text(xg,yg+0.25,text2,rotation=0,ha='center',va='center',fontsize=fsize,color=col)
plt.savefig(fnameF, dpi=300, bbox_inches="tight", pad_inches=0)
c'est tout
Recommended Posts