当标记设置为像素时,如何在图例中更改标记大小/比例

时间:2019-01-28 08:33:39

标签: python matplotlib jupyter-lab

我正在用很小的标记分散地绘制数据点(请参见下面的屏幕抓图)。当我使用很小的标记“”时,图例很难阅读(示例代码取自here)。
(Python 3,Jupyter实验室)

enter image description here

如何增加图例中标记的大小。上述网站上显示的两个版本不起作用:

legend = ax.legend(frameon=True)  
for legend_handle in legend.legendHandles:  
    legend_handle._legmarker.set_markersize(9)

ax.legend(markerscale=6)

但是当标记设置为'。'时,这两个解决方案都可以起作用。
如何在传奇中展现更大的制造商?

来自intoli.com的示例代码:

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(12)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

for i in range(5):
    mean = [np.random.random()*10, np.random.random()*10]
    covariance = [ [1 + np.random.random(), np.random.random() - 1],  [0, 1 + np.random.random()], ]
    covariance[1][0] = covariance[0][1]  # must be symmetric
    x, y = np.random.multivariate_normal(mean, covariance, 3000).T
    plt.plot(x, y, ',', label=f'Cluster {i + 1}')

ax.legend(markerscale=12)

fig.tight_layout()
plt.show()

2 个答案:

答案 0 :(得分:4)

通过将标记大小设置为1像素,可以为plt.plot(x, y, marker='s', markersize=72./fig.dpi, mec="None", ls="None") 获得1像素大小的标记。看起来像

markerscale

上述操作将标记设置为正方形,将标记大小设置为ppi(每英寸点数)除以dpi(每英寸点数)==点==像素,并去除线条和边缘。

然后您在图例中使用import numpy as np import matplotlib.pyplot as plt np.random.seed(12) fig = plt.figure() ax = fig.add_subplot(1, 1, 1) for i in range(5): mean = [np.random.random()*10, np.random.random()*10] covariance = [ [1 + np.random.random(), np.random.random() - 1], [0, 1 + np.random.random()], ] covariance[1][0] = covariance[0][1] # must be symmetric x, y = np.random.multivariate_normal(mean, covariance, 3000).T plt.plot(x, y, marker='s', markersize=72./fig.dpi, mec="None", ls="None", label=f'Cluster {i + 1}') ax.legend(markerscale=12) fig.tight_layout() plt.show() 尝试的解决方案很好用。

完整示例:

ActiveRecord

enter image description here

答案 1 :(得分:1)

根据this discussionmarkersize在使用像素(,)作为标记时不起作用。如何生成自定义图例呢?例如,通过改编this tutorial中的第一个示例,可以得到一个不错的图例:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

np.random.seed(12)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

for i in range(5):
    mean = [np.random.random()*10, np.random.random()*10]
    covariance = [ [1 + np.random.random(), np.random.random() - 1],  [0, 1 + np.random.random()], ]
    covariance[1][0] = covariance[0][1]  # must be symmetric
    x, y = np.random.multivariate_normal(mean, covariance, 3000).T
    plt.plot(x, y, ',', label=f'Cluster {i + 1}')



##generating custom legend
handles, labels = ax.get_legend_handles_labels()
patches = []
for handle, label in zip(handles, labels):
    patches.append(mpatches.Patch(color=handle.get_color(), label=label))

legend = ax.legend(handles=patches)

fig.tight_layout()
plt.show()

输出看起来像这样:

result of above code