更改matplotlib图例中的标签格式

时间:2019-01-01 15:46:20

标签: python matplotlib

我想在matplotlib中自定义图例。

我想水平排列图例中的标签,并取下手柄。标签的颜色必须与线条颜色相同。

当前,我已将句柄设置为不可见,但无法更改标签的顺序。

期待专家的意见。

预期输出:

enter image description here

到目前为止,我取得了以下成就,

import org.apache.spark.sql.{DataFrame, Dataset, Encoder, SparkSession}

// Implicit SparkSession to make the call to further methods more transparent.
implicit val spark = SparkSession.builder.master("local[*]").getOrCreate()
import spark.implicits._

def makeDf[T: Encoder](seq: Seq[T], colNames: String*)
                      (implicit spark: SparkSession): DataFrame =
  spark.createDataset(seq).toDF(colNames: _*)

def makeDS[T: Encoder](seq: Seq[T])
                      (implicit spark: SparkSession): Dataset[T] =
  spark.createDataset(seq)

输出:

enter image description here

谢谢。

编辑: 如果我设置

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 20, 1000)
y1 = np.sin(x)
y2 = np.cos(x)

plt.figure(figsize=(10,7))
lines=[]
lines.append(plt.plot(x, y1, '-b', label='sine')[0])
lines.append(plt.plot(x, y2, '-r', label='cosine')[0])
plt.legend(loc='upper left')
plt.ylim(-1.5, 2.0)
for item_legend,handle,line in zip(plt.legend().get_texts(),plt.gca().get_legend().legendHandles,lines):
    plt.setp(item_legend, color=line.get_color(),size=30)
    handle.set_visible(False)

plt.show()

标签在一行中对齐,但以前的所有格式均已删除。

1 个答案:

答案 0 :(得分:2)

这是您可以执行的操作。此处左对齐的关键是使用handletextpad=0handlelength=0。这里的columnspacing控制图例两列之间的水平空间。将手柄长度设为0只会显示图例文本。然后,您最终可以根据相应的曲线调整图例文本的颜色。

l = plt.legend(loc='upper left', ncol=2, handlelength=0, handletextpad=0, columnspacing=0.5, fontsize=36)

handles = plt.gca().get_legend().legendHandles

for i, text in enumerate(l.get_texts()):
    text.set_color(lines[i].get_color())    

编辑(基于评论)

在将图例定义为

时,可以避免通过将lines的长度设置为ncol来手动指定列数。
l = plt.legend(loc='upper left',ncol=len(lines), handlelength=-0.2, columnspacing=-0.2, fontsize=36)

您还可以通过将透明度参数alpha设置为0,使用透明度参数handles[i].set_alpha(0) 来删除/隐藏该句柄。

handles[i].set_visible(False)

或将其隐藏为

def ispalindrome(self,s,i,j):
    while (i < j):
        if (s[i] != s[j]):
            return False
        i+=1
        j-=1
    return True
def helper(self,i,current,s,ans):
    if(i==len(s)):
        ans.append(current)
        return
    for j in range(i,len(s)):
        if(self.ispalindrome(s,i,j)):
            current.append(s[i:j+1])
            self.helper(j + 1, current, s, ans)
            current.pop()
def partition(self, A):
    current=[]
    ans=[]
    self.helper(0, current, A, ans)
    return ans

enter image description here