matplotlib中带有单个像素标记的散点图

use*_*296 5 python matplotlib scatter-plot

我试图用散点图绘制一个大型数据集.我想用matplotlib用单像素标记来绘制它.它似乎已经解决了.

https://github.com/matplotlib/matplotlib/pull/695

但我找不到如何获得单个像素标记.

我的简化数据集(data.csv)

Length,Time
78154393,139.324091
84016477,229.159305
84626159,219.727537
102021548,225.222662
106399706,221.022827
107945741,206.760239
109741689,200.153263
126270147,220.102802
207813132,181.67058
610704756,50.59529
623110004,50.533158
653383018,52.993885
659376270,53.536834
680682368,55.97628
717978082,59.043843
Run Code Online (Sandbox Code Playgroud)

我的代码如下.

import pandas as pd
import os
import numpy
import matplotlib.pyplot as plt

inputfile='data.csv'
iplevel = pd.read_csv(inputfile)
base = os.path.splitext(inputfile)[0]

fig = plt.figure()
plt.yscale('log')
#plt.xscale('log')
plt.title(' My plot:  '+base)
plt.xlabel('x')
plt.ylabel('y')
plt.scatter(iplevel['Time'], iplevel['Length'],color='black',marker=',',lw=0,s=1)
fig.tight_layout()
fig.savefig(base+'_plot.png', dpi=fig.dpi)
Run Code Online (Sandbox Code Playgroud)

您可以在下面看到这些点不是单个像素.

data_plot.png

任何帮助表示赞赏

Imp*_*est 10

问题

我担心你在引用的matplotlib git仓库中讨论的bugfix仅对有效plt.plot()而非有效plt.scatter()

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(4,2))
ax = fig.add_subplot(121)
ax2 = fig.add_subplot(122, sharex=ax, sharey=ax)
ax.plot([1, 2],[0.4,0.4],color='black',marker=',',lw=0, linestyle="")
ax.set_title("ax.plot")
ax2.scatter([1,2],[0.4,0.4],color='black',marker=',',lw=0, s=1)
ax2.set_title("ax.scatter")
ax.set_xlim(0,8)
ax.set_ylim(0,1)
fig.tight_layout()
print fig.dpi #prints 80 in my case
fig.savefig('plot.png', dpi=fig.dpi)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

解决方案:设置标记大小

解决方案是使用常用"o""s"标记,但将markersize设置为恰好一个像素.由于标记大小以点给出,因此需要使用图形dpi来计算点中一个像素的大小.这是72./fig.dpi.

完整的例子:

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(4,2))
ax = fig.add_subplot(121)
ax2 = fig.add_subplot(122, sharex=ax, sharey=ax)
ax.plot([1, 2],[0.4,0.4], marker='o',ms=72./fig.dpi, mew=0, 
        color='black', linestyle="", lw=0)
ax.set_title("ax.plot")
ax2.scatter([1,2],[0.4,0.4],color='black', marker='o', lw=0, s=(72./fig.dpi)**2)
ax2.set_title("ax.scatter")
ax.set_xlim(0,8)
ax.set_ylim(0,1)
fig.tight_layout()
fig.savefig('plot.png', dpi=fig.dpi)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述