我正在尝试使用Ubuntu 15.10上的gnuplot 4.6绘制带有连接点的散点图。
我的.dat文件如下所示:
X Y ?
63072000 33 New York
64022400 12 Sacramento
64022400 21 Seattle
315532800 33 Boston
639964800 21 San Francisco
706320000 33 Seattle
因此,X轴包含日期,Y轴包含事件,其中数字表示组中的天气状况(10 - >晴天条件,30 - >雨天条件,等等,第二个数字描述严重性)。 X,以及Y可以多次出现。 颜色(或形状)或点应指明我标记的位置?以上。 最终,图表应显示日期,事件以及趋势(通过连接点)。
我尝试了以下内容,我在此SO post中找到了:
plot "weather.dat" u 1:2:3 with lines
但X范围似乎无效。有人看到错误吗? :/
还有一件事:没关系,如果gnuplot或matplotlib-我感谢任何方向的暗示:)
谢谢!
修改
答案 0 :(得分:3)
您提供的链接带来了世界地图。我在这里显示的示例只有带有连接它们的线的标记(因此它们不是地理定位的)。在任何情况下使用matplotlib(不了解GNUplot),您可以调整以下配方:
import random
import matplotlib.pyplot as plt
x = ['01.01.1960','12.01.1960','12.01.1960','01.01.1970','13.04.1980']
y = ['Heavy Rain','Sunshine','Slight Hail','Heavy Rain','Slight Hail']
l = ['New York','Sacramento','Seattle','Boston','San Francisco']
nx,ny = [],[]
for i in range(len(x)):
nx.append(i)
ny.append(-i)
s = random.randint(100,150)
m = random.choice(['o','s','^','d'])
color = random.randint(0,255)/255,random.randint(0,255)/255,random.randint(0,255)/255
plt.scatter(i,-i,s=s,marker=m,color=color,label=y[i])
plt.text(i,-i,x[i])
plt.plot(nx,ny,'--')
plt.legend()
plt.show()
这将提供如下图像:
注意我改变标记的大小,标记本身,颜色,向每个点添加文本,最后提示图例。
如果您想根据实际位置绘制地图,可能需要查看Basemap
编辑(海报清除后的意图): 以下代码:
xt = [63072000,64022400,64022400,315532800,639964800,706320000]
y2 = [33,12,21,33,21,33]
l = ['New York','Sacramento','Seattle','Boston','San Francisco','Seattle']
lm = ['o','s','^','d','*','^']
cl = ['red','blue','green','orange','purple','green']
import matplotlib.pyplot as plt
from matplotlib.dates import YearLocator, MonthLocator, DateFormatter,AutoDateLocator
import datetime
# get the dates into something readable
x2 = [datetime.datetime.fromtimestamp(i) for i in xt]
years = YearLocator() # every year
months = MonthLocator() # every month
yearsFmt = DateFormatter('%Y')
auto = AutoDateLocator()
# plot lines and markers
fig, ax = plt.subplots()
ax.plot_date(x2, y2, '--',color='black')
for i in range(len(x2)):
ax.scatter(x2[i],y2[i],s=300,marker=lm[i],color=cl[i])
plt.text(x2[i],y2[i],l[i])
# format the ticks
ax.xaxis.set_major_locator(auto)
ax.xaxis.set_major_formatter(yearsFmt)
ax.xaxis.set_minor_locator(months)
ax.autoscale_view()
ax.set_yticks([10,20,30], minor=False)
ax.set_yticklabels(['Sunny','More or Less','Rainy'])
#ax.yticks([10,20,30], ['Sunny','More or Less','Rainy'], rotation='vertical')
ax.fmt_xdata = DateFormatter('%Y-%m-%d')
ax.grid(True)
fig.autofmt_xdate()
plt.show()
,将产生以下结果:
注意:我必须说这是一个非常奇怪的情节。直观地,在我看来,每个城市的趋势应该是,而不是城市之间(每个城市应该有一条线,尽管你似乎没有数据来做这样的情节)。无论如何,这是满足您要求的代码。
答案 1 :(得分:0)
有几处更正:
首先,列分隔符似乎是一个制表符,因此您可以写:
...
axes = plt.gca()
axes.lines = []
...
否则,“暴雨”“纽约”和“重型”“雨纽约”之间会有歧义
其次,必须描述时间格式:
set datafile separator "\t"
第三,没有数字数据值,但set xdata time
set timefmt "%d.%m.%Y"
和labels
颜色取决于值,因此可能会尝试一些有趣的选项:
palette