Grafik aus Python mittels matplotlib2tikz in tex nutzen

Tabellen und Grafiken erstellen und anordnen


Axel_S
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: Do 8. Feb 2018, 16:48

Grafik aus Python mittels matplotlib2tikz in tex nutzen

Beitrag von Axel_S »

Hallo,

ich habe eine Frage zum Zusammenspiel dieser Software.
Ich tue folgendes:
Ich erstelle in Python Matplotlib einen Graphen.
import matplotlib as mpl
import matplotlib.pyplot as plt

import numpy as np
mpl.style.use('seaborn-colorblind')

import glob

from matplotlib2tikz import save as tikz_save

Daten_roh = np.loadtxt('plot_Tempkalibrierung_roh.dat',skiprows=6)
Daten_kal = np.loadtxt('plot_Tempkalibrierung_kal.dat',skiprows=6)

Daten_rohM = np.matrix([Daten_roh[:,0],
				 ...
				 Daten_roh[:,39]])

Daten_kalM = np.matrix([Daten_kal[:,0],
				 ...
				 Daten_kal[:,39]])

roh_min = np.squeeze(np.asarray(Daten_rohM.min(0)))
roh_max = np.squeeze(np.asarray(Daten_rohM.max(0)))
kal_min = np.squeeze(np.asarray(Daten_kalM.min(0)))
kal_max = np.squeeze(np.asarray(Daten_kalM.max(0)))

fig = plt.figure(figsize=(7,4))
ax = fig.add_subplot(111)	
xachse = np.arange(0, 27923)*2/3600
ax.fill_between(xachse[11500:12600],roh_min[11500:12600],roh_max[11500:12600],color = 'red',alpha=0.2, label ='roh')
ax.fill_between(xachse[11500:12600],kal_min[11500:12600],kal_max[11500:12600],color = 'blue',alpha=0.2, label ='kal')

ax.plot(xachse[11500:12600],Daten_kal[11500:12600,2],'k',label='ref')
ax.grid()		
plt.xlabel('Zeit (h)')
plt.ylabel('Zeit in \si{\\degreeCelsius}')
plt.ylim(59.95,60.45)
plt.legend()
#plt.show()
tikz_save('Kalibrierauswertung.pgf')

Dieser sieht dann auch super aus, wenn ich ihn mir anzeigen lasse. Bild habe ich angefügt.

Wenn ich mir den entsprechenden Code anzeigen lasse sieht dieser so aus:
% This file was created by matplotlib2tikz v0.6.14.
\begin{tikzpicture}

\begin{axis}[
xlabel={Zeit (h)},
ylabel={Zeit in \si{\degreeCelsius}},
xmin=6.35836111111111, xmax=7.02997222222222,
ymin=59.95, ymax=60.45,
tick align=outside,
tick pos=left,
xmajorgrids,
x grid style={white!69.019607843137251!black},
ymajorgrids,
y grid style={white!69.019607843137251!black},
legend style={draw=white!80.0!black},
legend cell align={left},
legend entries={{ref},{roh},{kal}}
]
\addlegendimage{no markers, black}
\path [draw=red, fill=red, opacity=0.2] (axis cs:6.38888888888889,62.739)
--(axis cs:6.38888888888889,62.106)
--(axis cs:6.38944444444444,62.119)
--(axis cs:6.39,62.099)
...
--cycle;

\path [draw=blue, fill=blue, opacity=0.2] (axis cs:6.38888888888889,62.5879316853268)
--(axis cs:6.38888888888889,61.9106342850214)
--(axis cs:6.38944444444444,61.9235743705174)
--(axis cs:6.39,61.9176020251081)
...
--(axis cs:6.38944444444444,62.5550997327063)
--(axis cs:6.38888888888889,62.5879316853268)
--cycle;

\addplot [semithick, black]
table {%
6.38888888888889 62.4369057060658
6.38944444444444 62.4070223582104
6.39 62.3791311779396
6.39055555555556 62.3442671274878
...
6.99944444444444 55.1620916186744
};
\end{axis}

\end{tikzpicture}
Ich habe mal ein paar Datenpunkte weggelassen, damit es nicht zu lang wird. In TEX erhalte ich dann allerdings folgendes Bild.

In Tex ist der Code so eingebunden:
\begin{figure}
	\centering 
	\input{B:/Pr...g/Kalibrierauswertung.pgf}
	\caption{beipsielhafte Kalibriererebnisse}
	\label{G_KaliTemp}
\end{figure}
Ich habe dazu 2 Fragen:
- Wieso stimmt die Legende nicht und wie kann ich das ändern?
- Wieso werden die Größenangaben aus python nicht übernommen und wie kann ich das ändern?

Vielleicht noch eine dritte Frage: Sollte es eher ein python Problem sein, weiß jemand an wen ich mich dann wenden kann?

Danke und Gruß,
Axel
Dateianhänge
Grafik mit python erstellt
Grafik mit python erstellt
python.png (54.7 KiB) 3199 mal betrachtet
Darstellung des Exports in Tex
Darstellung des Exports in Tex
tex.png (27.04 KiB) 3205 mal betrachtet

Rolli
Forum-Guru
Forum-Guru
Beiträge: 382
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Beitrag von Rolli »

Hallo Axel_S,

bitte erstelle doch ein compilierfähiges Minimalbeispiel.
Deine Beispiele funktionieren leider nicht, wie Du selber feststellen kannst, wenn Du auf das blaue "Öffne im Overleaf" klickst.

Und verzeihe mir meine Frage: Zeitangabe in der Einheit °C ???

Gruß vom Rolli

Axel_S
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: Do 8. Feb 2018, 16:48

Beitrag von Axel_S »

Hallo,

ich habe den Code mal entsprechend vereinfacht und das Ergebniss aus dem python Export direkt in Tex eingefügt.
\documentclass[]{article}

\usepackage[utf8]{inputenc} 
\usepackage[T1]{fontenc}           
\usepackage[ngerman]{babel}

\usepackage{siunitx}
\usepackage{graphicx}
\usepackage{subcaption}

\usepackage{pgfplots}
\usepackage{wrapfig} 

\usepackage[a4paper, total={6.5in, 9in}]{geometry}

%opening
\title{Titel}
\author{ich}

\begin{document}

\begin{figure}
	\centering 
		% This file was created by matplotlib2tikz v0.6.14.
		\begin{tikzpicture}
		
		\begin{axis}[
		xmin=0.95, xmax=2.05,
		ymin=1.85, ymax=5.15,
		tick align=outside,
		tick pos=left,
		xmajorgrids,
		x grid style={white!69.019607843137251!black},
		ymajorgrids,
		y grid style={white!69.019607843137251!black},
		legend style={at={(0.03,0.97)}, anchor=north west, draw=white!80.0!black},
		legend cell align={left},
		legend entries={{ref},{roh},{kal}}
		]
		\addlegendimage{no markers, black}
		\path [draw=red, fill=red, opacity=0.2] (axis cs:1,3)
		--(axis cs:1,2)
		--(axis cs:2,2)
		--(axis cs:2,3)
		--(axis cs:2,3)
		--(axis cs:1,3)
		--cycle;
		
		\path [draw=blue, fill=blue, opacity=0.2] (axis cs:1,5)
		--(axis cs:1,4)
		--(axis cs:2,4)
		--(axis cs:2,5)
		--(axis cs:2,5)
		--(axis cs:1,5)
		--cycle;
		
		\addplot [semithick, black]
		table {%
			1 2
			2 5
		};
		\end{axis}
		
		\end{tikzpicture}
	\caption{caption}
	\label{G_KaliTemp}
\end{figure}
	

\end{document}
Hierzu noch der entsprechende Code aus Python:
import matplotlib as mpl
import matplotlib.pyplot as plt

import numpy as np
mpl.style.use('seaborn-colorblind')

from matplotlib2tikz import save as tikz_save

fig = plt.figure(figsize=(7,4))
ax = fig.add_subplot(111)	
ax.fill_between([1, 2],[2, 2],[3, 3],color = 'red',alpha=0.2, label ='roh')
ax.fill_between([1, 2],[4, 4],[5, 5],color = 'blue',alpha=0.2, label ='kal')
ax.plot([1, 2],[2, 5],'k',label='ref')
ax.grid()		
plt.legend()
#plt.show()
tikz_save('minimalbeispiel.pgf')
Das Bild aus python mit richtiger Legende ist wieder im Anhang zu finden.
Ich würde ja fast vermuten, dass es am Export matplotlib2tikz liegt, da Tex den Code ja darstellt und die Größenangaben im Tex-Code auch nicht erzeugt werden. Aber wenn sich damit schonmal jemand befasst hat dann sicherlich die TEXer =)

Viele Grüße,
Axel

Nachtrag: Ja, Zeiten werden nicht in °C angegeben. Aber wenn ich so etwas ausprobiere, ändere ich immer mal ein paar Kleinigkeiten (z.B. lösche ich auch mal einen Buchstaben oder tue sonst was anderes), um zu prüfen ob die Änderungen auch im Tex-pdf angekommen sind. Aber wenn ich das Problem der Legende gelöst habe, werde ich das sicherlich auch noch schaffen. :wink: Nur Not kann ich na nochmal nach der richtigen SI Einheit der Zeit fragen :D
Dateianhänge
minimal_python.png
minimal_python.png (20.42 KiB) 3119 mal betrachtet

Gast

Beitrag von Gast »

Mit matplotlib2tikz kenne ich mich nicht aus, aber mit einem ähnlichen Paket für R habe ich mal rumgespielt. Da war es so, dass man die Dimensionen des Bildes für den Export beim Äquivalent von tikz_save explizit angeben musste. https://github.com/nschloe/matplotlib2tikz#usage scheint Ähnliches zu suggerieren. Ich vermute mal, dass matplotlib2tikz die Angaben in plt.figure(figsize=(7,4)) nicht verarbeiten kann und explizite Angaben beim Export benötigt.

Das mit der Legende hingegen sieht mir fast nach einem Problem mit matplotlib2tikz selbst aus. Eventuell solltest Du zuerst die Dokumentation befragen, und wenn Du dann nach einer vernünftigen Wartezeit hier keine Antwort bekommst, mal bei https://github.com/nschloe/matplotlib2tikz/issues nachfragen. Bevor Du da einen Bugreport startest, solltest Du aber die aktuelle Version von GitHub testen, vielleicht ist das Problem ja schon behoben worden. Deine Version v0.6.14 scheint ein paar Tage hinter der aktuellen zu sein https://pypi.python.org/pypi/matplotlib2tikz, https://github.com/nschloe/matplotlib2tikz/releases

Rolli
Forum-Guru
Forum-Guru
Beiträge: 382
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Beitrag von Rolli »

Ich kenne mich mit matplotlib2tikz ebenfalls nicht aus. Allerdings fällt mir auf, dass Dein MB eine Warning wirft:

"Package pgfplots Warning: running in backwards compatibility mode (unsuitable t ick labels; missing features). Consider writing \pgfplotsset{compat=1.14} into your preamble. on input line 28."

Wie Gast vorhin schon geschrieben hat: Ich würde zuerst mal auf die aktuelle Version "updaten" - falls es sich um einen Bug handeln sollte, wäre dieser dann evtl. bereits behoben.

Außerdem könnte es ja auch helfen, die o.a. Warnung ernst zu nehmen.

Gruß vom Rolli

Axel_S
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: Do 8. Feb 2018, 16:48

Beitrag von Axel_S »

Guten morgen,

das Problem der Größen könnte ich lösen. Da hatte ich einfach den Eintrag übersehen. Ein Update auf die aktuelle Version hat leider keine Lösung gebracht. Die Warnung könnte man mit entsprechendem \pgfplotset{} Eintrag auch beheben. Also scheint es wohl wirklich ein Python Problem zu sein :(

Mal gucken was man da machen kann...

Antworten